通过本文可了解的内容:
- Input.is_action_pressed()
- Input.is_action_just_pressed()
- Input.is_action_just_released()
问题
不少游戏都有这样一个机制:按下跳跃键,跳到一个普通高度,按住不放,跳得更高。
通过文档,我们可以知道,在Godot3中,对按键的按下的监听有:
- Input.is_action_pressed():按住不放
- Input.is_action_just_pressed():按下那一瞬间
它们的主要区别在于: is_action_pressed, 在按住按键后,每一帧都会进行处理,而is_action_just_pressed,则只会在按下那一瞬间得到处理。之后,即使按住,也不会有任何事件产生。
那么,理想的是对它们分别做处理,is_action_just_pressed用于普通跳,is_action_pressed用于高跳。但是,实际和想像是有区别的,因为: 不管是不是按住不放,is_action_just_pressed都会触发,如果对它们分别处理,只会让角色跳得更高。
而且,如前面所说,is_action_pressed在按住后,每一帧都会被处理,也就是说,如果使用它,那按住不放后,角色会不断的来回跳。如果正巧需求不是这样的,自然也是不合适的。
实现
这里,我们使用is_action_just_pressed和is_action_just_released来处理,分两步:
- 按下跳跃键后默认跳到最高点
- 在上升过程中的任何时间,松开按键,取消上升
代码非常简单:
if Input.is_action_just_pressed('jump'):
velocity.y -= jumpHigh
if Input.is_action_just_released('jump') and velocity.y < 0:
velocity.y = 0
velocity.y < 0 :用于检测角色是否已经处于上升中。 如果下降也触发,会造成角色停顿 。
但是这样仍然会有一个问题,那就是,如果按得相对快的时候,角色会跳得极低,且突然向量为0,角色会咔的一下停下来,非常不理想,如图:
因此,需要一个最低值,也就是普通高度做限制,且需要计算余下多少距离到普通高度,用于y轴上的向量值。
稍做修改:
if Input.is_action_just_released('jump') and velocity.y < 0:
if jumpHigh - abs(velocity.y) < jumpNormal:
velocity.y += jumpHigh - jumpNormal
在释放按钮的时候,对高度做一个判断,因为在重力的作用下,y轴上的向量会变小,所以,如果这个值小于普通跳跃高度时,我们用普通高度减去当前的y轴向量长度,即得到y轴上剩余的向量长度,做到最小高度为普通跳跃高度。
看看效果:
可以看出,不再出现突然停住的现象,符合因重力作用速度慢慢变低后再下落的过程。而且始终有一个最小的跳跃高度。
结束