冲动跳跃


12

有一件事情一直困扰着我,那就是如何在平台游戏机中实现“人造脉冲”跳跃。如果您不知道我在说什么,请考虑一下《马里奥》,《柯比》和《洞穴物语》中的《名言》。他们有什么共同点?好吧,跳跃的高度取决于按住跳跃按钮的时间。

知道这些角色的“冲动”并不是像实际物理学中那样在跳动之前就已经建立的,而是在空中时建立的,也就是说,您可以很好地将手指抬起至最大高度的中途,即使在它和句号之间的减速;这就是为什么您可以轻松地跳一跳并保持跳远的原因-我对它们如何保持轨迹成弧形着迷。

我当前的实现方式如下:

在此处输入图片说明

按下跳转按钮时,重力将关闭,并且化身的Y坐标系将因重力的恒定值而减小。例如,如果事物跌落到每刻度Z个单位,它将增加每勾Z个Z单位。

释放按钮或达到限制后,虚拟化身会减速,使其覆盖X个单位,直到其速度达到0;一旦完成,它就会加速直到其速度与重力匹配-坚持这个例子,我可以说它从0加速到Z单位/刻度,同时仍然覆盖X单位。

但是,此实现会使跳跃变得过于对角,并且除非化身的速度快于重力,否则这将使其在我当前的项目中变得太快(它在大约每跳动4像素处移动,而重力在每跳动10像素处移动) 40FPS的帧率),它也使它比水平更垂直。那些熟悉平台游戏的人会注意到,角色的弧形跳跃几乎总是使他们能够跳得更远,即使它们的速度不如游戏的重力那么快;如果游戏不正确,即使玩法不正确,也会证明自己是正确的。非常违反直觉的。我知道这一点是因为我可以证明我的实现非常烦人。

在此处输入图片说明

有没有人尝试过类似的机制,甚至可能成功了?我想知道这种平台游戏跳跃的背后是什么。如果您以前没有任何经验,并且想尝试一下,那么请不要尝试纠正或增强我所解释的实现,除非我采取了正确的方法-尝试从以下方面弥补您的解决方案刮。我不在乎您是否使用重力,物理学或其他方法,只要它能显示出这些伪脉冲的工作原理即可。

另外,我希望它的显示避免特定语言的编码。例如,为我们分享一个C ++示例或Delphi ...就像我在我的项目中使用XNA框架一样,并且不介意C#的东西,我没有太多的耐心来阅读别人的代码,某些使用其他语言的游戏开发人员可能会对我们在此处获得的成就感兴趣,因此不要介意使用伪代码。

预先谢谢你。


3
您是否看过以下问题及其答案?gamedev.stackexchange.com/questions/29617/...
bummzack

@bummzack这也很清除。
Mutoh 2012年

1
可能具有跳转处理和重力的重复功能虽然没有漂亮的图片,但这是相同的问题。
MichaelHouse

Answers:


8

我认为您的主要问题在于:

按下跳转按钮时,重力将关闭,并且化身的Y坐标系将因重力的恒定值而减小。例如,如果事物跌落到每刻度Z个单位,它将增加每勾Z个Z单位。

重力不是那样的。Google详细介绍了“匀速加速运动”,但简单地说,正如另一位成员所说,重力是加速,而不是速度。

简单地说,而速度的变化恒定速率位置随着时间的推移,加速度的变化恒定速率的速度随着时间的推移。

因此,您的首要任务是更改下降算法,使其包括加速度,而不仅仅是速度。代替:

pos_y = pos_y + (velocity_y * time_difference)

你将不得不做类似的事情

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

这样,一切都将落在抛物线中,这是物理上正确的运动。

现在,要实现简单的跳转(此后我们将解决您的确切问题),只需将其设置velocity_y为所需的值即可。只要符号acceleration_y和所需的符号velocity_y不同,对象就会正确跳动(换句话说,您不会“关闭重力”。保持打开状态,只需将对象的速度设置为某个预定义的值即可)。

您会注意到,velocity_y当您开始跳跃时,跳跃越大,跳跃就越高。因此,要实现您想要的效果,您可以为跳跃添加某种加速度(从物理角度而言,这意味着要添加力量。可以考虑向对象添加一枚小型火箭)。

为此,您需要执行与以前相同的操作,但是现在加速度和速度应具有相同的符号。您可以在按下按钮时执行此操作:

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

解决方案是不延迟减速。当您将球扔向空中时,直到达到最大高度为止,球并不会以恒定的速度运动,而是从冲力瞬间开始减速。

重力不是速度,而是加速度。因此,如果玩家的速度超过20个单位,并且重力为-10个单位,则在下一个滴答声中,向上的速度将为10个单位,接下来为0个单位,依此类推。

您的跳动看起来像是对角线的原因是因为您的播放器的上下速度是恒定的。因此,如果从字面上沿着玩家的路径画一条线,您将看到一条重力值在x位置变化处的斜率(正或负)的线。

为了让玩家控制跳跃的高度,应为玩家提供一定的初始冲动速度,应关闭重力,并将特殊的重力值(小于常规重力)应用于玩家的速度。释放跳跃按钮或玩家速度达到0后,应应用法向重力。

这样,无论他们是否通过常规重力减速,玩家都将在跳跃过程中看到优美的曲线。


2

简短的故事是:您的跳跃弧中某处将有一个非抛物线部分。

在实施跳跃时,我尝试了几种方法:

  • 恒定爬升:实际上是您要尝试的:固定垂直垂直速度,直到松开按钮为止,此时法向重力开始。弧线在上升时是对角线,但在下降时是法线-实际上通常看起来还可以,并且(更重要的是)感觉还可以,因为很容易判断跳高的高度。

  • 被捕的攀爬:在这里,您可以开始施加角色初始冲动,以最大高度的抛物线开始使角色上升。然后,释放按钮时,将垂直速度设置为零(或较小的向上速度)。这意味着最大的跳跃是有保证的抛物线,较小的跳跃更像是在做大跳跃然后放慢速度。

  • 可变的初始脉冲:这是我最终选择的脉冲:按下跳跃将施加足以使跳跃产生的初始向上脉冲,然后在短时间内继续施加向上加速度(远大于重力)-跳跃窗口-直到按钮被释放。一旦跳窗关闭,动作就会变成抛物线,可变初始冲动的周期足够短以至于看起来并不奇怪,但又足够长,可以为有经验的玩家提供足够的空间来控制跳高。不利的一面是,判断跳跃高度并不容易,因为窗户小得多,而且释放力矩与高度没有对应关系。由于大多数情况下都是这样,所以无论如何您都希望轻拍或跳高,所以这不是问题。

尝试这些,看看哪种感觉最好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.