我最近在看这个系列的教程,学了一段时间后感觉内容有些多,所以在这里做个小结,记录一下 HeartBeast 对于游戏功能的实现。
变量解释
1 hspeed_ = 0; //横向速度 2 max_hspeed_ = 4; //横向最大速度 3 4 vspeed_ = 0; //纵向速度 5 gravity_ = .5; //重力 6 jump_height_ = -8; //最大跳跃高度 7 8 acceleration_ = 1; //加速度 9 friction_ = .5; //摩擦力
这里 HeartBeast 避免了使用内置属性,理由是这样更自由灵活,避免了黑箱操作。
横向移动
1 var hinput = keyboard_check(vk_right) - keyboard_check(vk_left); 2 3 if hinput != 0 { 4 hspeed_ += hinput * acceleration_; 5 hspeed_ = clamp(hspeed_, -max_hspeed_, max_hspeed_); 6 } else { 7 hspeed_ = lerp(hspeed_, 0, friction_); 8 } 9 10 x += hspeed_;
这里用了很巧妙的方法,把左右键的输入赋值给了 hinput ,这样 hinput 的值就是1或-1。
如果检测到用户按下了左右键,hspeed_ 就会逐渐增大,但会限制在 -max_hspeed_ 和 max_hspeed_ 之间。当用户松开时,hspeed_ 就会递减到0,这样移动就会显得灵活而富有弹性。
纵向跳跃
1 if !place_meeting(x, y+1, o_solid) { 2 vspeed_ += gravity_; 3 } else { 4 if keyboard_check_pressed(vk_up) { 5 vspeed_ = jump_height_; 6 } 7 } 8 9 y += vspeed_;
如果没有碰到“墙”,就会产生一个“重力加速度”( gravity_ ),站在“墙”上时,按下跳跃键, vspeed_ 的值增大为 jump_height_ ,而后会“落下”。
墙壁碰撞
1 if place_meeting(x+hspeed_, y, o_solid) { 2 while !place_meeting(x+sign(hspeed_), y, o_solid) { 3 x += sign(hspeed_); 4 } 5 hspeed_ = 0; 6 } 7 8 if place_meeting(x, y+vspeed_, o_solid) { 9 while !place_meeting(x, y+sign(vspeed_), o_solid) { 10 y += sign(vspeed_); 11 } 12 vspeed_ = 0; 13 }
这里 HeartBeast 测试过,如果直接用 if 语句让碰撞时的速度为0,碰撞时会出现空隙,且速度越大空隙越大,原因是程序运行时会产生预判,导致提前停止运动(其实我也不太懂)。
然后他加入了一个 while 语句,让程序不断地检测下一个像素有没有碰到墙,直到完全碰上为止,这样处理后就可以避免缝隙的产生。
按键映射
1 keyboard_set_map(ord("D"), vk_right); 2 keyboard_set_map(ord("A"), vk_left); 3 keyboard_set_map(ord("W"), vk_up);
有的人可能不习惯方向键操纵,而更喜欢AWDS键移动,所以这里将A,W,D键映射到方向键上,这样A,W,D键也可以操控
至此是第一个教程视频的内容,实现了简单的移动、跳跃、碰撞。