如何为每(数)毫秒运行一次的游戏制作“循环”?

Posted

技术标签:

【中文标题】如何为每(数)毫秒运行一次的游戏制作“循环”?【英文标题】:How do I make a "loop" for a game, that runs every (number) of milliseconds? 【发布时间】:2013-08-20 14:53:08 【问题描述】:

我尝试在google和***上搜索这个,但我不知道该怎么称呼它,所以我找不到它。

如何为 C# 程序创建一个“循环”,它每隔 100 毫秒运行一次?类似于 Minecraft 所称的“滴答声”,或 GameMaker 所称的“步骤”。

我不知道该怎么做。我正在使用视觉工作室,我有一个主窗口。有些事情我想不断地执行,所以我想弄清楚如何制作“步骤”或“更新”功能。

【问题讨论】:

使用whileTimer? 您应该使用某种可以为您提供此功能的游戏设计框架。你不是吗? 您可以使用 XNA,它具有为此目的而设计的更新和绘制方法。但是我觉得 XNA 已经死了,你也可以看看 MonoGame。 @AthomSfere 只有在循环代码需要 0 毫秒才能运行时才有效。它不会。其次,Sleep 对于大多数游戏来说没有足够的精度;它最终会睡过头。 @Gjeltema 我不知道。我不是该领域的专家。我知道的足够多,知道我不想解决这个问题;我会使用游戏设计 API,而不是冒险做错。 【参考方案1】:

如果您希望它运行 100 毫秒,您可以这样做

System.Timers.Timer timer = new System.Timers.Timer(100);
public void Initialize(object sender, EventArgs e)

  timer.Elapsed+=Elapsed;

public void Elapsed(object sender, System.Timers.ElapsedEventArgs e)

  //do stuff

你可以做一些其他的事情,但是我认为这个没有那么有效

        using System.Threading;

        Thread th = new Thread(new ThreadStart(delegate
        
            while (true)
            
                Thread.Sleep(100);
                //do stuff
            
        ));

或者,你可以下载monogame用c#制作更精致的游戏

http://www.monogame.net/

它有自己的游戏时间控件。

【讨论】:

Timer 的精度对于游戏循环来说是不够的。它的精度是 +/- 16 毫秒或类似的东西。游戏不可能有这种差异。 那你有什么建议吗,Servy? 那我何时以及如何致电Initialize?我试图这样做,但我不知道要调用什么参数。 您只需双击您的表单,即可创建 Form1_Load。您可以右键单击>折射器>将其重命名为 Initialize。 @user2697979 不;如果我这样做了,我会发布一个答案。我不是游戏设计专家。我对这个主题有足够的了解,知道这是一个非常难以解决的问题,而这与真正的解决方案相去甚远。【参考方案2】:

您可以使用 Timer 控件,该控件可以设置为在给定的时间间隔内滴答作响。间隔属性以毫秒为单位,因此您需要 Timer1.Interval = 100;

【讨论】:

Timer 的精度对于游戏循环来说是不够的。它的精度是 +/- 16 毫秒或类似的东西。游戏不可能有这种差异。【参考方案3】:

你在想Timer吗?

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

在应用程序中生成重复事件。

【讨论】:

Timer 的精度对于游戏循环来说是不够的。它的精度是 +/- 16 毫秒或类似的东西。游戏不可能有这种差异。

以上是关于如何为每(数)毫秒运行一次的游戏制作“循环”?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 游戏循环

luogu1005 矩阵取数游戏

在 C++ 中,如何生成每 5 分钟更改一次的随机数(1 或 2)?

游戏制作大致流程粗谈之五

为啥游戏循环渲染的次数多于更新的次数

试图制作make子手游戏,但陷入循环?