7

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

据我了解,我应该使用timer,但我真的不知道如何在游戏循环中执行此操作(尚未构建,因为我不知道如何使用计时器。但它应该是while loop我认为应该是)。当敌人“接触”玩家时游戏结束(x 和 y 相同)。

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

谢谢你。

4

2 回答 2

19

您通常不会在游戏中使用常规计时器。游戏有一种非常不同的机制来处理它们的逻辑和经过的时间,它们通常不能与计时器一起工作,或者不是以你期望的方式工作:

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

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 方格。然后它最终会每秒移动一个完整的方格。

于 2013-07-03T06:06:02.623 回答
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

于 2013-07-03T05:53:16.333 回答