GameMaker Studio 2—制作横版射击游戏教程-HeartBeast 短期小结1

我最近在看这个系列的教程,学了一段时间后感觉内容有些多,所以在这里做个小结,记录一下 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键也可以操控

至此是第一个教程视频的内容,实现了简单的移动、跳跃、碰撞。

猜你喜欢

转载自www.cnblogs.com/2ufun/p/12362857.html