2014-07-09 62 views
0

我在C#中的WindowsForms应用程序中制作一个“Main()”函数。我一直在关注C#中的游戏编程。当我运行这些示例时,一切都正常,但是当我尝试使自己的版本无法正常工作时。c#while循环阻止窗体加载

这里的main()函数:

public void Main() 
    { 
     while (!gameOver) 
     { 
      // Non timed code:   
      int ticks = Environment.TickCount; 
      if (ticks > lastTick + 16) 
      { 
       lastTick = ticks; 
       //Timed (60FPS) code here: 
       Application.DoEvents(); 
      } 
     } 
    } 

当我把这种现象称为“Form1_Load的”函数内的形式甚至不显示,当我启动该程序,同时不放弃任何错误或警告(同事情是在运行的例子中完成的)。如果我将“Main()”移动到例如“MouseClick”并且窗体显示,并且当我点击时,该功能开始按照它应该运行。

我真的不知道为什么发生这种情况。我在这里错过了非常明显的东西吗?

+0

如果这是您的整个主要功能(假设它在'Program.cs'文件中),则永远不会加载要显示的表单。 – entropic

+0

在页面加载中放置一个断点,然后检查您的代码。可能的一个因素是'检查gameOver'是否返回错误 –

+2

10这本书多大年纪?在任何情况下,DoEvents都是一个坏主意。 –

回答

2

表单的Load事件并不完全是启动游戏循环的最佳位置。负载被激发有两个基本原因。 “好”的方式是当它响应Show()调用时发生,通常出现在Program.Main()方法中。你的游戏循环将起作用。

“不好”的方法是当窗体构造函数中的代码要求窗体的Handle属性有效时。这迫使Winforms创建本地窗口并触发Load。这仍然通常达到一个好的结局,赔率变得越低,它越来越复杂。

因为Load事件处理程序没有返回而出错。这意味着构造函数无法完成。这意味着窗口不可见。这意味着“gameOver”永远不会成为现实。游戏结束。你用调试器诊断这一点,在Load事件处理器上设置一个断点并查看Call Stack窗口。期望你会在构造函数中看到导致问题的语句。

最后但并非最不重要的,要非常谨慎的this failure mode

真正的解决方法是将此代码放在正确的位置。这是在Program.Main()方法中。大致为:

[STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     // Application.Run(new Form1()); Not this anymore 
     var window = new Form1(); 
     window.Show(); 
     // Your game loop here 
     //... 
    } 
0

你可以尝试把循环逻辑在静态无效的方法和线程

这样,它会去了解它的快乐的方式和形式会继续和负载

执行它