我们先创建一个obj_enemy,作为所有敌人的模板,再创建一个obj_maker,用于限制它的移动范围。在obj_enemy里添加create事件,填写下面的代码
hp=1; atk=0;
添加step事件,填写下面的代码
if (hp<=0) instance_destroy();
然后,我们可以创建一个外星小怪物了,名叫obj_slim_green。赋予贴图spr_slim_green,父对象选择obj_enemy,添加create事件,填写下面的代码
hp=10; spd=2; dir=1;
上面的代码,表示我们重新定义了敌人的HP,速度和方向。
继续,添加destroy事件,填写下面的代码,这样敌人被消灭后,会有一个粒子效果。
effect_create_above(ef_firework,x,y,1,false);
添加step事件,让怪物动起来。
event_inherited();
if(global.game_state==states.playing)
{
if place_meeting(x,y,obj_block) or place_meeting(x,y,obj_marker)
{
dir*=-1;
image_xscale=image_xscale*-1;
}
x+=spd*dir;
}
虽然敌人干掉主角的方式,是撞主角,但是它目前还无法对主角构成危险,因为缺少碰撞事件的处理。
碰撞事件:当主角被怪物撞到后,会有一小段无敌的时间,同时会自动跳起来,和敌人拉开距离。要怎么设计呢,
我们需要两个开关变量,叫无敌和跳跃。在obj_player的create事件里,添加两行代码
//伤害开关 invincible=false; force_jump=false;
在step事件里添加如下代码,我们模拟主角的闪烁效果,就像在超级马里奥里一样,通过不断地激活和停用贴图的可见度。
if invincible
{
visible=not visible;
}我们还修改跳跃代码,让主角强制跳起来一次,只要修改第一阶段的跳跃就好了,
//jump,从地面往上跳的状态
if force_jump or ( jumping and (grounded or wall_jump))
{
grounded=false;
vsp=-jspd;
force_jump=false;
//walll jump -phase1
if wall_jump
{
dash_recharging=false;
effect_create_below(ef_smoke,x,y,1,c_white);
facing_dir*=-1;
image_xscale=facing_dir;
direction=point_direction(x,y,x+facing_dir,y);
wj_goal_x=x+80*facing_dir;
already_walljumping=true;
wall_jump=false;
}
sprite_index=spr_player_jump;
audio_play_sound(snd_jump,1,false);
}最后,我们要在主角身上增加一个伤害判定。添加碰撞事件,对象为obj_enemy,插入如下代码
if (not invincible)
{
audio_play_sound(snd_hit,1,false);
hp--;
if hp>0
{
force_jump=true;
invincible=true;
alarm[2]=room_speed*1;
}
else
{
audio_play_sound(snd_kill_player,1,false);
global.game_state=states.gameover;
instance_destroy();
}
}这样,主角在撞到怪物后会掉一格血,如果没血了,游戏就结束。
我们添加闹钟2,让无敌时间只持续一秒钟。
invincible=false; visible=true;
主角消灭敌人的方式是用她手里的镭射枪,所以我们要增加子弹的伤害判定。修改obj_bullet,添加它和怪物的碰撞事件,插入代码
other.hp-=atk; instance_destroy();
OK,就这样,《隔离》的战斗系统就加上了。
按F5,测试一下,效果如下



暂无关于此日志的评论。