如何使角色跳跃?


44

我目前正在使用Direct X 9.0在C#中制作游戏。游戏重制为《大金刚》。我几乎完成了所有工作,但是我对Mario跳高的物理学存在疑问。我为Y和X坐标声明了变量。

我想知道是否有一个简单的方法来做到这一点。我在上下搜索了一个答案,但是找到的答案不相关/或使用其他编程语言(例如XNA)。

我目前设置了一个bool变量来检查是否按下了W,这将触发任何代码使他跳转。我一直在诸如此类的混乱。

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

哪个效果不好。我一直在寻找一个答案,但现在我很绝望,如果有人可以向我指出简单解决方案的正确方向。那很好啊。非常感谢您的任何回应。


5
使用其他编程语言的答案应该不会造成问题。该算法是您感兴趣的,而不是特定的实现...除非您只是希望在不了解任何内容的情况下进行复制和粘贴,但我当然希望您不会!能够读取和修改其他编程语言中的算法是一项非常好的技能。
ccxvii 2013年

Answers:


84

首先,XNA也使用C#,因此它是相同的编程语言。而且尽管底层API可能与DirectX有所不同,但与跳转无关,因此此处应使用相同的教程或答案。另外,取决于许多因素,有很多方法可以实现此目的。我将在下面描述的只是可能性之一。

基本物理要求

首先,在更新循环中需要一些基本的物理变量和计算。特别是,您需要定义位置,速度和重力,并且更新循环应该执行与此大致相似的操作(为简单起见,省略了碰撞检测和响应):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

固定高度跳

现在,无论按多长时间,实现始终具有相同高度的跳转的最简单方法就是更改垂直速度一次。这将使角色开始上升,而重力将自动照顾将其放下:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

重要提示如果您的角色不在地面上,您将不希望开始跳跃,因此您需要为此添加一个检查。

可变高度跳

但是像Mario和Sonic这样的游戏具有可变的跳跃,跳跃的高度取决于您按下按钮的时间。在这种情况下,您需要同时按下释放跳转键。您可以添加如下内容:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

在上面的代码中调整所有这些值(例如0.5-12.0f-6.0f),您可以更改跳动的感觉,跳高程度,即使松开跳动按钮后仍保持多少动力,跌落速度等等。 。

重要不要在每一帧都调用这些函数。按下或释放键时仅调用一次。否则,您的角色将飞行而不是跳跃。

工作范例

我刚刚创建了一个上述技术的快速示例,您可以在此处的浏览器上尝试该示例(按鼠标键进行跳转,将其释放到中间以控制跳转的高度)。它在JS中,但是就像我前面提到的,在这种情况下,语言是无关的。

http://jsfiddle.net/LyM87/


11
还不妨借此机会分享几天前撰写的这篇精彩文章,并提供与以下主题有关的信息:实施2D平台的指南。还有这个:Sonic Jumping
David Gouveia 2012年

2
本文介绍了一种与答案不同的变量跳转方法。它要求抑制重力或在按住按钮时继续增加脉冲。我通常会按照David在回答中所说的那样做,但是有什么想法是本文的方法吗?
杰夫

@Jeff也引起了我的注意,这就是为什么我提到有多种实现方法的原因。第一篇文章描述了解决同一问题的两种其他方式,而我描述的方式则基于第二篇文章。我不知道它们之间如何比较,尽管它们中的任何一个都很容易实现。最后,我选择此方法是因为它更易于解释,并且不需要添加计时器或处理幅度减小的多个脉冲。
David Gouveia,2012年

答案可能会因具体游戏和您要制作的动画数量而异。《银河战士》使用恒定的速度跳跃:/下降,但通过高质量的动画工作对其进行掩盖,以使其在天顶处看起来平滑且“弯曲”。许多其他平台程序使用变速跳跃,这需要更多的工作才能使其正常运行。
肖恩·米德迪奇

1
5年后,这非常有帮助:)而且这个小提琴非常酷-我应该学习JS!
流动性

1

就像物理学一样。仅在您按下jump key并且角色在地面上的那一刻起才增加向上的速度(称为脉冲),但使角色始终因重力而下落。

如果您不希望角色每次撞到地面时都跳起来(因为您正在握住)jump key,则添加释放并jump key is being pressed清除之后jump key设置的变量。伪代码:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

如果我使用您的方式:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

如何donkey.y改变取决于您的想象力。速度应该变小,高空中的驴使它看起来更好。

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.