我们先创建一个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,测试一下,效果如下
暂无关于此日志的评论。