【问题标题】:Jumping effect in games游戏中的跳跃效果
【发布时间】:2013-01-19 05:07:15
【问题描述】:

我目前正在尝试使用 XNA 制作一个基本的平台游戏,我想知道如何创建“跳跃效果”。我目前有允许横向移动的基本键盘输入,但我希望我的精灵慢慢地进入跳跃而不是立即传送到那里(现在我每次跳跃时都有类似 Rectangle.Y += 40 的东西,使精灵立即出现在那里)。有人有什么见解吗?

【问题讨论】:

  • 您可以添加第二个运动矢量(除了位置)。然后,在每次更新时,将运动矢量添加到位置矢量。在跳跃时,设置运动矢量以使玩家缓慢向上移动。在跳跃的最高点,改变它以使玩家向下移动。跳跃后,置零。如果有几件事会影响运动矢量,则需要小心(添加而不是设置它,以免覆盖现有运动)

标签: xna


【解决方案1】:

我并不完全了解如何在 XNA/C# 中实现这一点,但在我制作的 Flash 游戏中,我只是添加了一个垂直速度属性。我会尽量把所有东西都写成 C#..

示例;创建速度属性:

float verticalVelocity = 0;

垂直速度应该不断降低(通过重力)。在玩家可以访问的地方设置重力属性:

float Gravity = 2.5;

在你的播放器update() 方法中,将verticalVelocity 增加Gravity。还将播放器的Y 位置增加verticalVelocity。这将模拟坠落:

verticalVelocity += Gravity;
Position.Y += verticalVelocity; // this may be -= in XNA, not sure where the y axis beings

当您撞击表面时,速度应重置为 0。

最后,要跳转,只需从 verticalVelocity 中减去给定值:

public void Jump(float height)
{
    // Only jump if standing on a surface.
    if(verticalVelocity == 0)
        verticalVelocity -= height;
}

【讨论】:

  • 为了可扩展性,你应该创建一个PhysicsSimulation(或类似的)类并让它包含一个List<Body>,其中Body是一个基类,玩家和任何其他应该受到影响的对象,都继承自。然后你可以更新PhysicsSimulation,它可以处理所有对象的重力。这使您可以使游戏玩法更加丰富,而没有太大的难度。
  • @annonymously 这是给 OP 的建议,而不是我自己吗?
【解决方案2】:

您最终会想要在游戏中添加重力和可能的其他力,因此我强烈建议您避免很多痛苦并实施某种基本的力系统。这可以使用Vector2s 来完成,因为您可以将它们添加到角色的速度中。然后对你的角色施加一个瞬间的力量来推动它。

如果你真的不想用物理引擎,你可以用Y和字符X的跳跃高点做一个Vector2,然后使用Vector2.Lerp方法在字符位置和跳转结束点之间进行插值。

这通常是一个非常糟糕的系统,我强烈建议您使用现有的物理引擎,或者制作自己的简单引擎。

【讨论】:

    【解决方案3】:

    使用sinusoid

    代码应如下所示:

    float ground = 0.0f;
    float angle  = 330.0f;
    
    jump(){
    if(ground == 0.0f)ground = Rectangle.Y;
      if(Rectangle.Y <= ground)
      {
        Rectangle.Y+=Math.Sin(angle/(Math.Pi*180));
        angle++;
      }
    }
    

    【讨论】:

    • 如果将此代码放在 Update 方法中,它将不起作用。你的逻辑有点不对劲,角色只会以可变的速度向上移动。我想你真正想做的是:Rectangle.Y = (int)(ground+Math.Sin(angle/(Math.PI*180)));
    • 这就是为什么我使用+= 而不是=
    • 使用+=会将右操作数添加到左操作数,而这里我们希望将ground添加到Sin值,然后将其分配给Rectangle.
    • 不,我们没有,ground 仅用于保存当前的地面值,这样我们可以计算玩家何时完成跳跃并再次到达地面。当然这不会在不规则表面上,但这只是一个简单的例子。
    【解决方案4】:

    如果您动态修改 ySpeed,而不是仅仅添加 40,您可以准确地创建重力效果。

    你想声明一个 ySpeed

    ySpeed = 0;
    

    那你要使用加速度变量

    acceleration = 0.25;
    

    好的,既然我们已经这样做了,让我们添加重力,前提是我们的玩家没有接触到地板。

    if(playerLocationY + playerHeight > floorLocationY)
    {
         gravity = false;
    }
    else
    {
        gravity = true;
    }
    
    if(gravity)
    {
        ySpeed += acceleration;
    }
    

    既然我们已经把它记下来了,我们想加入一些可以让我们跳跃的东西。

    if(KeyPressed == UP)
    {
        ySpeed -= acceleration;
    }
    

    这将使我们的玩家向上移动

    我们现在要确保我们确实在移动,所以让我们添加最后一行,我们就完成了。

    playerLocationY += ySpeed;
    

    恭喜你成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多