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

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

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

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

【问题讨论】:

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

标签: c# visual-studio game-loop


【解决方案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 毫秒或类似的东西。游戏不可能有这种差异。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 2019-03-20
  • 2022-01-13
相关资源
最近更新 更多