用《GMS2》做一款《坦克大战》游戏的BOSS 04

29일 전

之前文章里提及用《GameMaker Studio 2 Mobile》已经将《坦克大战》的游戏框架完成了,剩下要做的也只是设置不同的关卡而已,所以该游戏是基本完成了。但,人总需要创新对吧。所以我们是否可以给每一关添加一名BOSS呢?答案是肯定的,说干就干哦!

a2231844-f795-47b5-9d00-903362153a89.png

在精灵里添加BOSS图片素材后,在物体里新建一个BOSS的物体。导入图片,添加“创建”事件:

face = 3;//方向0123上右下左
image_speed = 0;//图片为静止
shoot_timer = 0;//主炮子弹时间
shoot_timer2 = 0;//副炮子弹时间
dx=0;//移动相关
dy=1;//移动相关
timer = 0;//移动重置时间
timer3 = 0;//碰撞再次触发时间
pspzj = 0.5;//移动速度
death_timer = 0;//死亡计时
hp=2000;//BOSS的HP
sfyl=20;//BOSS的物理防御力

再添加“步”事件,步事件就是BOSS的行动事件:

if(player_HP<= 0)//如果玩家的HP少于等于0,退出以下代码
{
   exit;
}

//=================================================================

if(hp<=0){  //如果自身HP少于等于0
    if(death_timer=10){instance_create_depth(x-20,y-20,-20,obj_boom1);audio_play_sound(snd_cboom,0,0);}//死亡倒计时10,播放爆炸音效及动画,实现多重爆炸效果
        if(death_timer=35){instance_create_depth(x+20,y-20,-20,obj_boom1);audio_play_sound(snd_cboom,0,0);} //死亡倒计时35,播放爆炸音效及动画,实现多重爆炸效果
            if(death_timer=60){instance_create_depth(x-20,y+20,-20,obj_boom1);audio_play_sound(snd_cboom,0,0);} //死亡倒计时60,播放爆炸音效及动画,实现多重爆炸效果
                if(death_timer=85){instance_create_depth(x+20,y+20,-20,obj_boom1);audio_play_sound(snd_cboom,0,0);} //死亡倒计时85,播放爆炸音效及动画,实现多重爆炸效果
                    if(death_timer=110){instance_create_depth(x,y,-20,obj_big_boom);audio_play_sound(snd_cboom,0,0);} //死亡倒计时110,播放爆炸音效及动画,实现多重爆炸效果
    if(death_timer=150){room_goto(room_victory);audio_stop_all()}////死亡倒计时150,停止所有音乐,跳转画面到胜利界面
    death_timer +=1;//每帧死亡时间加1
    exit;
    }//如果状态为死亡就自我毁灭

var px,py,tmp,tmp2;//临时变量

px = obj_player.x;//判断玩家的所在位置X值
py = obj_player.y; //判断玩家的所在位置Y值

//AI移动,与普通坦克的随机移动不同,BOSS会通过检查玩家的所在位置,对玩家进行追击

if(timer==0)
{
   dx=0;
   dy=0;
    
    if(px>=x && py>=y)
     {
       if(px-x > py-y)
       {
         dx=+1;face=0;
       }
         else
       {
         dy=+1;face=3;
       }
     }

   if(x>=px && py>=y)
     {
       if(x-px > py-y)
       {
         dx=-1;face=2;
       }
         else
       {
         dy=+1;face=3;
       }
     } 

   if(px>=x && y>=py)
     {
       if(y-py > px-x)
       {
         dy=-1;face=1;
       }
         else
       {
         dx=+1;face=0;
       }
     } 
 
   if(x>=px && y>=py)
     {
       if(y-py > x-px)
       {
         dy=-1;face=1;
       }
         else
       {
         dx=-1;face=2;
       }
      }
  timer = 50;
}

//=====================================================================

    //发射
    if(shoot_timer==0)
    {
    shoot_timer = 200;//子弹时间=10
    if(face=1){tmp = instance_create_depth(x,y-50,1,obj_boss1_p_s);}//如果脸方向为1,子弹位置-25
    if(face=3){tmp = instance_create_depth(x,y+50,1,obj_boss1_p_x);}
    if(face=2){tmp = instance_create_depth(x-50,y,1,obj_boss1_p_z);}
    if(face=0){tmp = instance_create_depth(x+50,y,1,obj_boss1_p_y);}
    tmp.direction = face*90//direction默认为0*90度
    tmp.image_index = face;//图片指数等于脸朝向
    tmp.speed = 6;//子弹速度为6
    }
    
    if(shoot_timer2==0)
    {
    shoot_timer2 = 20;//子弹时间=10
    if(face=1){tmp2 = instance_create_depth(x,y-20,1,obj_d_boss1_zd) tmp2.direction = 95-irandom(10)}//如果脸方向为1,子弹位置-25
    if(face=3){tmp2 = instance_create_depth(x,y+20,1,obj_d_boss1_zd) tmp2.direction = 275-irandom(10)}
    if(face=2){tmp2 = instance_create_depth(x-20,y,1,obj_d_boss1_zd) tmp2.direction = 185-irandom(10)}
    if(face=0){tmp2 = instance_create_depth(x+20,y,1,obj_d_boss1_zd) tmp2.direction = irandom(10)-5}
   // tmp2.direction = face*(95-irandom(10));//direction默认为0*90度
    tmp2.speed = 7;//子弹速度为7
    }

if(collision_rectangle(x-40+dx*2,y-40+dy*2,x+40+dx*2,y+40+dy*2,obj_qiang_1,0,0))//如果撞墙就无法前进随机掉头,x-=左,y-=上,x+=右,y+=下
{
  dx = -dx;
  dy = -dy;
  face = (face+2) mod 4;//除以4取整
}

if(timer>0)timer-=1;

//设计计时器
if(shoot_timer>0)shoot_timer -=1;//如果子弹时间大于0,就减少子弹时间
if(shoot_timer2>0)shoot_timer2 -=1;

//**坐标变化
x += dx*pspzj;
y += dy*pspzj;
//***动画控制
if(dx!=0 || dy!=0)//如果在移动中,就播放动画
{
  image_index +=0.1;//动画速度
}

switch(face)//条件判断
{
   case 1:sprite_index = spr_boss1_s;break;//方案1显示精灵指数为:sprite_up<--对应精灵
   case 0:sprite_index = spr_boss1_y;break;
   case 3:sprite_index = spr_boss1_x;break;
   case 2:sprite_index = spr_boss1_z;break;
}

除了行动事件之外,我还给它添加了碰撞事件,让BOSS碰撞到树或者石头的时候,都会将其毁灭,显出BOSS的震慑力。碰撞事件:

instance_create_depth(other.x+16,other.y+16,-1,obj_boom)//碰撞时播放爆炸动画
with(other)instance_destroy();//被碰撞物体消失

另外,如果BOSS碰撞到玩家的时候,我希望出现一种碾压的效果,那么我们可以把BOSS的图层设计比玩家高,然后再加碰撞代码:

if(player_HP<=0){exit;}//如果玩家HP少于等于0,退出以下代码
if(timer3=0)//触发时间
{
instance_create_depth(other.x,other.y,-1,obj_boom)//播放爆炸动画
player_HP-=player_HP_MAX*0.1;//无视防御,每次减玩家MAX_HP的10%血量
timer3+=10;//触发时间为每10帧一次
}
if(timer3>0){timer3-=1;}//计算触发时间

另外,我们希望玩家与BOSS接触时(碾压时),玩家的移动速度会降低,所以我们需要在玩家的“步”时间里添加一行代码:

if(collision_rectangle(x-25+dx*psp/10+fan_ying/30,y-25+dy*psp/10+fan_ying/30,x+25+dx*psp/10+fan_ying/30,y+25+dy*psp/10+fan_ying/30,obj_diren_laoda,0,0) || collision_rectangle(x-25+dx*psp+fan_ying/30,y-25+dy*psp+fan_ying/30,x+25+dx*psp+fan_ying/30,y+25+dy*psp+fan_ying/30,obj_shui,0,0))//如果撞BOSS或水
{
  x+=dx*(psp/10*0.7+psp2*0.7);
  y+=dy*(psp/10*0.7+psp2*0.7);
}
else
{
x+=dx*(player_speed);
y+=dy*(player_speed);
}

如果与BOSS接触或行走在水上的时候,移动速度只有原来的70%。那么,BOSS的设置也完成啦。如果有不明白的地方可以留意提问哦,再见~

用GMS2写一个坦克大战的敌人坦克AI 01

用GMS2写一个坦克大战的Player 02

用GMS2制作一款《坦克大战》游戏 03

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
STEEMKR.COM IS SPONSORED BY
ADVERTISEMENT
Sort Order:  trending

高手

[WhereIn Android] (http://www.wherein.io)