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

本文关键字:几毫 等待 代码 何使 | 更新日期: 2024-09-25 00:51:30

我做了一些冲突if语句,但它们不起作用。

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

因此,如果我们采用第一个语句,框最初位于左下角。根据我的代码,在我的游戏中,理想情况下是向右+向上,一旦它击中最顶部的横幅,它应该向下+向右,因此X和Y的位置都会增加。但实际情况是,它开始反弹得很快,在调试后,我意识到它永远卡在第一个if中,几乎就像它碰撞了两次,将Y恢复到初始运动,第三次碰撞,然后一遍又一遍地进行这个过程。

这就引出了一个问题,我如何才能让更新代码运行得稍微慢一点,或者在半秒钟或类似的时间之后,这样当它运行时,就不会误解冲突?非常感谢!

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

如果查看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的入门工具包:Platformer。你可以在底部找到下载链接。有很多信息可以从中获取,比如有效的屏幕/输入管理或基本的物理引擎。在我看来,这是官方文件中最好的东西。