c# - 如何在 C# 中让代码等待几毫秒?

标签 c# xna collision game-physics

我做了一些冲突 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 恢复到其初始运动,第三次碰撞,然后重新执行该过程等等。

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

最佳答案

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

关于c# - 如何在 C# 中让代码等待几毫秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28803187/

相关文章:

c# - 如何使用 Zendesk v2 API 仅获取已解决的票证

c# - 如何检查 Texture2D 是否透明?

python - 查找圆与矩形碰撞的碰撞边时出现问题

c++ - 碰撞后移除物体(子弹物理)

c# - 调试 .net 的 WebClient

c# - AspNetUsers (Identity) 和自定义表之间的一对多关系

c# - 将数据集动态绑定(bind)到 RDLC 报告

c# - XNA 无法将 2D Sprite 表的一部分绘制到屏幕,结果是黑线

C# 如何确保所需的 UDP 数据到达客户端/服务器?

c# - .net 中的 HashTable/Dictionary 实现选择了哪种类型的冲突解决方案?