我正在构建一个简单的控制台游戏,当按键按下时会有移动的玩家,并且有自动移动的敌人,每种类型的敌人在X中移动一次毫秒
据我所知,我应该使用timer
,但我真的不知道如何在游戏循环中做到这一点(尚未构建,因为我不知道如何处理计时器。但它应该是while loop
我认为。当敌人“触摸”玩家时(同样的x和y),游戏结束。
一件重要的事情:Thread
我不能参与此练习,但如果您有其他建议而不是Timer
,我们欢迎您。
谢谢。
答案 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