6

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

   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
        }
   }

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

4

3 回答 3

4

第一个建议,不要使用++and --。使您的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)

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

于 2013-01-25T22:24:45.967 回答
0

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

于 2013-01-25T22:31:38.810 回答
0

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

于 2013-01-25T22:31:40.257 回答