如何在C#游戏中控制加速和减速

时间:2013-01-25 22:17:33

标签: c# xna

我正在制作驾驶游戏。视图是透视图,玩家的视角来自向前行驶的汽车后方。当汽车向前行驶时,它周围的所有环境都会向下移动并缩放(现在看起来相当不错),这给人的印象是汽车向前移动。现在,我希望有一些逼真的驾驶控制,这样汽车可以提高速度,然后在向上箭头释放时逐渐减速。目前,当按下向上箭头时,我会调用几个精灵的所有移动功能。我正在寻找一种方法来控制它,以便在汽车缓慢等时不会经常调用这些函数。到目前为止我的代码是:

   protected void Drive()
    {
        KeyboardState keyState = Keyboard.GetState();

        if (keyState.IsKeyDown(Keys.Up))
        {
            MathHelper.Clamp(++TruckSpeed, 0, 100);
        }
        else
        {
            MathHelper.Clamp(--TruckSpeed, 0, 100);
        }

        // Instead of using the condition below, I want to use the TruckSpeed
        // variable some way to control the rate at which these are called 
        // so I can give the impression of acceleration and de-acceleration.

        if (keyState.IsKeyDown(Keys.Up))
        {
            // Lots of update calls in here
        }
   }

我认为这应该很容易,但由于某种原因,我无法理解它。非常感谢这里的一些帮助!感谢

3 个答案:

答案 0 :(得分:4)

首先建议,不要使用++--。将TruckSpeed增加的速度乘以Delta Time。这意味着您的加速和减速在较慢和较快的计算机上的工作方式相同,并且与帧速率提升无关。您还可以使用不同的增加和减少率来更好地控制游戏玩法。

有些事情:

protected void Drive(GameTime gameTime) // Pass your game time
{
    KeyboardState keyState = Keyboard.GetState();
    if (keyState.IsKeyDown(Keys.Up))
    {
        TruckSpeed += AccelerationRatePerSecond * gameTime.ElapsedGameTime.TotalSeconds;
    }
    else
    {
        TruckSpeed -= DecelerationRatePerSecond * gameTime.ElapsedGameTime.TotalSeconds;
    }
    MathHelper.Clamp(TruckSpeed, 0, 100);
    ...

此外,您可以替换

if (keyState.IsKeyDown(Keys.Up))

通过

if (TruckSpeed > 0)

将相机连接到您的模型并在环境中移动而不是将整个环境移动到卡车周围可能更简单...

答案 1 :(得分:0)

最简单正确的方法是将键盘控制与物理分开。您希望在更改/每单位时间内测量加速度而不是更改/按钮单击。每次迭代时,您需要根据自上次更新后经过的时间修改速度...

答案 2 :(得分:0)

加速度不是线性的。因此,我建议不要使用++或 - 运算符。而是调用一个函数来计算速度随时间的变化(ΔV)/时间。如果你想要一种真正的加速感觉,你可能会想到这样的效果。