使用计时器和游戏循环

我正在构建一个简单的控制台游戏,有一个玩家在按下按键时移动 ,并且有自动移动的敌人,每种类型的敌人在X毫秒内移动一次

据我所知,我应该使用timer ,但我真的不知道如何在游戏循环中做到这一点(尚未构建,因为我不知道如何处理计时器。但它应该是while loop我认为)。 当敌人“触摸”玩家时(同样的x和y),游戏结束。

一件重要的事情:我不能在Thread练习中,但如果您有其他建议而不是使用Timer ,欢迎您。

谢谢。

你通常不在游戏中使用传统的计时器。 游戏有一个非常不同的机制来处理它们的逻辑和时间,它们通常不能与定时器一起使用或不按照你期望的方式工作:

游戏通常具有称为游戏循环的东西。 一般来说,它是循环中一个接一个地调用的三个主要函数:

 while(running) { HandleUserInput(); ChangeWorld(); Render(); } 

您可以获得用户输入,相应地更改游戏世界并将其绘制到屏幕上。 现在,计算机越快,此循环运行得越快。 这对图形有好处(想想FPS),但对游戏不利。 想象一下俄罗斯方块,块的每一帧都移动。 现在我不想买更快的电脑,游戏会变得更加困难。

因此,为了保持游戏速度不变,与计算机的功率无关,循环会考虑时间的流逝:

 while(running) { var timePassedSinceLastLoop = CalculateTimeDelta(); HandleUserInput(); ChangeWorld(timePassedSinceLastLoop); Render(); } 

现在想象一下游戏中某事的冷却时间。 玩家按下了“a”,发生了一些很酷的动作,虽然他可能再次按下“a”,但接下来的5秒钟什么都不会发生。 但游戏仍在运行,并且可能会发生所有其他可能发生的事情。 这不是传统的计时器。 它是一个变量,让我们称之为ActionCooldown,一旦玩家触发动作,它就会设置为5秒。 每当世界发生变化时,从该数字中减去timePassed直到它为零。 游戏一直在运行并处理输入和渲染。 但只有一旦ActionCooldown达到零,另一次按下“a”将再次触发该动作。

ChangeWorld方法包括对世界的所有自动更改。 敌人,导弹,没有玩家互动的任何动作。 它会根据时间而移动。 如果敌人每秒移动一个方格,你需要使他的坐标成为一个浮点数,并在每次循环运行时添加一个方形的一小部分。

假设你有30 fps所以你的循环每秒运行30次。 你的敌人现在需要每个循环移动1/30平方。 然后它最终会每秒移动一个完整的方块。

计时器背后的一般前提是每n重复一些代码。

要创建计时器,请使用:

  System.Timers.Timer aTimer = new System.Timers.Timer(); aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); // Set the Interval to 1 millisecond. Note: Time is set in Milliseconds aTimer.Interval=1; aTimer.Enabled=true; 

然后你实现这个方法:

 private static void OnTimedEvent(object source, ElapsedEventArgs e) { //Whatever you need repeated } 

完整的示例可以在这里找到: http //msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.71).aspx