【问题标题】:How do I make the code Wait for a few milliseconds in C#?如何让代码在 C# 中等待几毫秒?
【发布时间】:2015-05-02 09:57:42
【问题描述】:

我做了一些冲突的 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 中,几乎就像它碰撞了 2 次,将 Y 恢复到它的初始运动,第 3 次碰撞,然后重新执行该过程及以上。

这给我们带来了一个问题,我怎样才能让更新代码运行得慢一点,或者在半秒左右之后,所以当它运行时,它不会误解碰撞?非常感谢!

【问题讨论】:

  • 你可以使用 Thread.Sleep()
  • @Jamaxack 不,会冻结 Game 的线程。我认为您不想在每次更新对象时锁定游戏。把它想象成在一个 winform/WPF 应用程序中冻结你的 UI。

标签: c# xna collision game-physics


【解决方案1】:

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

【讨论】:

  • @Zee 我忘记在每次通话时重置ElapsedGameTime。编辑了我的答案以考虑到这一点,我添加了一个局部变量来存储总时间(每次超过任意 500 毫秒时都会重置)。
  • @Zee 我还添加了一个指向 MSDN 上该死的好教程的链接。他们包含源代码,这是学习 XNA 最好的东西之一。
  • 谢谢!我现在明白它是如何工作的,代码编译得很好,但似乎我的问题出在其他地方,不过感谢您的帮助,我真的很高兴了解到这一点。我也会确保检查tuto!你摇滚
猜你喜欢
  • 1970-01-01
  • 2014-12-04
  • 2016-02-14
  • 2012-10-03
  • 2022-06-15
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多