mfc 如何捕获按键按住不放_如何处理跳跃中长按与点按的不同高度 - Godot3.2D教程...

本文介绍了在Godot3游戏中如何区分按键的点按与长按,以实现不同的跳跃效果。通过使用`Input.is_action_pressed()`和`Input.is_action_just_pressed()`,在点按时执行普通跳跃,长按时执行高跳。在实现过程中,文章解决了快速按键导致角色突然停止的问题,确保跳跃有最小高度并符合物理下落效果。
摘要由CSDN通过智能技术生成

92c47fc1d0908f9c1bb464e1f4cb6934.png

通过本文可了解的内容:

  • Input.is_action_pressed()
  • Input.is_action_just_pressed()
  • Input.is_action_just_released()

问题

不少游戏都有这样一个机制:按下跳跃键,跳到一个普通高度,按住不放,跳得更高

9c151a65b0166066784d58a72736c489.png

通过文档,我们可以知道,在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来处理,分两步:

  1. 按下跳跃键后默认跳到最高点
  2. 在上升过程中的任何时间,松开按键,取消上升

代码非常简单:

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,角色会咔的一下停下来,非常不理想,如图:

6ff0895ca193e9caf3922777d1ba6382.png

因此,需要一个最低值,也就是普通高度做限制,且需要计算余下多少距离到普通高度,用于y轴上的向量值。

5c7569850cb6d608e66f6a475148ce85.png

稍做修改:

if Input.is_action_just_released('jump') and velocity.y < 0:
	if jumpHigh - abs(velocity.y) < jumpNormal:
		velocity.y += jumpHigh - jumpNormal

在释放按钮的时候,对高度做一个判断,因为在重力的作用下,y轴上的向量会变小,所以,如果这个值小于普通跳跃高度时,我们用普通高度减去当前的y轴向量长度,即得到y轴上剩余的向量长度,做到最小高度为普通跳跃高度。

看看效果:

c78f839e9dd2e56ad35329b980a8f483.png

可以看出,不再出现突然停住的现象,符合因重力作用速度慢慢变低后再下落的过程。而且始终有一个最小的跳跃高度。


结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值