使用计时器和游戏循环

2024-04-06

我正在构建一个简单的控制台游戏,玩家会移动当按键按下时,并且有移动的敌人自动,每种类型的敌人在 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 秒。每当世界发生变化时,都会从该数字中减去经过的时间,直到为零。游戏始终在运行并处理输入和渲染。但只有当 ActionCooldown 达到零时,再次按“a”才会再次触发该操作。

ChangeWorld 方法包括对世界的所有自动更改。敌人、导弹,任何无需玩家交互即可移动的东西。它根据时间移动。如果敌人每秒移动一个方格,您需要将他的坐标设置为浮点型,并在每次运行循环时添加一小部分方格。

假设您的帧率为 30 fps,因此循环每秒运行 30 次。现在,你的敌人需要在每个循环中移动 1/30 平方。那么它最终会每秒移动一整格。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用计时器和游戏循环 的相关文章

随机推荐