如何使代码在C#中等待几毫秒?

时间:2015-03-02 05:26:44

标签: c# xna collision game-physics

我在声明时发生了一些冲突,但它们没有用。

        birdbox3.X += 5;
        birdbox3.Y -= 5;

        if (birdbox3.Intersects(Banner1)) {

            birdbox3.Y += 10;

        }
        else if (birdbox3.Intersects(Banner2)) { 

            birdbox3.Y = -birdbox3.Y; }

因此,如果我们采用第一个声明,则该框最初位于左下角。根据我的代码,理想情况下,它会在我的游戏中正确+向上,一旦它击中极端顶部的横幅,它应该向下+向右,因此X和Y位置都将增加。但是发生的事情就是开始弹跳非常快,经过调试我意识到它永远停留在第一个如果,它几乎就像它碰撞了2次,将Y恢复到它的初始运动,第三次碰撞,并完成了整个过程结束。

这给我们带来了一个问题,我怎样才能使更新代码运行得慢一点,或者在半秒或者这样的传递后运行,所以当它运行时,它不会误解冲突?非常感谢!

1 个答案:

答案 0 :(得分:2)

如果您查看Update方法定义(如果您有常规GameComponentDrawableGameComponent),您会发现自己可以访问GameTime
public override void Update(GameTime gameTime)

您可以使用该变量仅在设定的时间后触发碰撞。要做到这一点,请用大if来包围所有内容,以检查已用时间:

private int elapsedTime = 0; //Declared at class level

public override void Update(GameTime gameTime)
{
    // We add the time spent since the last time Update was run
    elapsedTime += gameTime.ElapsedGameTime.TotalMilliseconds;

    if (elapsedTime > 500) // If last time is more than 500ms ago
    {
        elapsedTime = 0;
        birdbox3.X += 5;
        birdbox3.Y -= 5;

        if (birdbox3.Intersects(Banner1))
        {
            birdbox3.Y += 10;
        }
        else if (birdbox3.Intersects(Banner2))
        {
            birdbox3.Y = -birdbox3.Y;
        }
    }
}

在这种情况下,碰撞代码每500毫秒只运行一次。

我们需要每次运行Update时添加经过的时间。然后,当我们超过阈值时,我们运行冲突位并将计时器重置为0.

我们需要本地变量,因为ElapsedGameTime只知道自上次更新以来花费了多少时间。要在多个更新中携带该号码,我们需要将其存储在某个地方。


我也鼓励你看看MSDN's Starter Kit: Platformer。您可以在底部找到下载链接。有一个很多的信息可以从中获取,如有效的屏幕/输入管理或基本的物理引擎。在我看来,这是官方文档中最好的东西。