2015-03-02 197 views
2

我做了一些碰撞if语句,但他们没有工作。如何制作代码在C#中等待几毫秒?

 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恢复到初始运动,第三次碰撞,并且完成过程并结束。

这给我们带来了一个问题,我该如何让Update代码运行得慢一点,或者在半秒钟之后或者这样的过程中,所以当它运行时,它不会误解冲突?非常感谢!

+2

你可以使用Thread.Sleep() – Jamaxack 2015-03-02 05:27:35

+1

@Jamaxack Nope,会冻结游戏的线程。我认为每次更新对象时都不想锁定游戏。把它想象成冻结一个winform/WPF应用程序中的UI。 – 2015-03-02 05:45:07

回答

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

+0

真棒:)我需要完美的代码优化。 – Zee 2015-03-02 05:39:04

+0

@我在每次通话时都忘记了'ElapsedGameTime'重置。编辑我的答案,考虑到这一点,我添加了一个局部变量来存储总时间(每当我们超过任意500ms时都会重置)。 – 2015-03-02 05:44:23

+0

@Zee我还添加了一个来自MSDN的非常好的教程的链接。他们拥有源代码,是学习XNA最好的方法之一。 – 2015-03-02 05:52:03