使用计时器和游戏循环

时间:2013-07-03 05:45:46

标签: c#

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

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

一件重要的事情:Thread我不能参与此练习,但如果您有其他建议而不是Timer,我们欢迎您。

谢谢。

2 个答案:

答案 0 :(得分:20)

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

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

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的方块。然后它最终会每秒移动一个正方形。

答案 1 :(得分:1)

计时器背后的一般前提是每隔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