我们要分析一下这两个技能。
第一步:我们检查玩家的角色是否触碰了墙壁并且没有在地面。如果是,我们检查是否玩家按下了跳跃按钮,如果是,我们设置角色反弹跳跃。
第二步:当第一步执行后,如果角色接触了地面,我们就停止移动它。
开始制作这两个功能,代码如下,在obj_player的create事件里修改并添加如下代码
//stat spd=6; hsp=0; vsp=0; jspd=18;//跳跃力度 grv=0.8;//重力 grounded=false; //moving and jumping direction=0; facing_dir=1;//朝向右边,-1为朝向左边 //wall jump/slide can_wall_jump=true; wall_jump=false; wall_slide_friction=0.5; wj_goal_x=x; already_walljumping=false; gamepad_set_axis_deadzone(0,0.5);
继续在step事件里,修改原来的跳跃代码
//jump,从地面往上跳的状态 if jumping and (grounded or wall_jump) { grounded=false; vsp=-jspd; //walll jump -phase1 if wall_jump { 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); } if jump_released { vsp*=0.5; } if not grounded and not wall_jump and vsp>1 { sprite_index=spr_player_jump_fall; }
上面的代码,增加了墙跳功能的检测。如果墙跳为真,我们就不是普通的跳跃,玩家将会朝相反的方向跳跃。跳跃的移动量,这里设置为80,之后,设置already_jumping 为真。这些是第一步的代码。接来是第二步里的代码
在这段代码的前面
if jump_released { vsp*=0.5; } if not grounded and not wall_jump and vsp>1 { sprite_index=spr_player_jump_fall; }
我们添加如下代码
//wall jump-phase2 if already_walljumping { wj_move=spd*facing_dir; if(place_meeting(x+wj_move,y,obj_block)) { while(!place_meeting(x+sign(wj_move),y,obj_block)) { x+=sign(wj_move); } wj_move=0; already_walljumping=false; } x+=wj_move; already_walljumping=already_walljumping and ((facing_dir >0 and wj_goal_x>x) or (facing_dir<0 and wj_goal_x<x)); }
上面的代码里,会在第一步执行后,才会执行,它检测我们在墙跳后,是否还会碰撞到墙壁,如果是,wj_move设置为0,already_walljuming 设置为假,这样,就不会一直卡在第二步里。如果还没有碰撞到墙壁,那么,在执行完跳跃后,already_walljumingy设置为假。
我们按F5,测试一下,效果如下
最后,如果你遇到主角在墙跳后,卡在地面上的情况,应该是主角的每个动作图片的碰撞层参数不一样导致的。
接下来,我们将制作主角的猛冲技能。
暂无关于此日志的评论。