如何让代码在 C# 中等待几毫秒?
How do I make the code Wait for a few milliseconds in C#?
我做了一些碰撞 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 恢复到它的初始运动,第三次碰撞,然后重复这个过程并结束。
这让我们想到了一个问题,我怎样才能让更新代码 运行 稍微慢一点,或者在半秒或类似的时间之后,所以当它 运行s 时,它不会不会误解碰撞?非常感谢!
如果您查看 Update
方法定义(如果您有常规 GameComponent
或 DrawableGameComponent
),您会发现您可以访问 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。您可以在底部找到下载链接。可以从中获取 很多 信息,例如有效的 screen/input 管理或基本物理引擎。在我看来,这是官方文档中最好的东西。
我做了一些碰撞 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 恢复到它的初始运动,第三次碰撞,然后重复这个过程并结束。
这让我们想到了一个问题,我怎样才能让更新代码 运行 稍微慢一点,或者在半秒或类似的时间之后,所以当它 运行s 时,它不会不会误解碰撞?非常感谢!
如果您查看 Update
方法定义(如果您有常规 GameComponent
或 DrawableGameComponent
),您会发现您可以访问 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。您可以在底部找到下载链接。可以从中获取 很多 信息,例如有效的 screen/input 管理或基本物理引擎。在我看来,这是官方文档中最好的东西。