我在C#中的WindowsForms应用程序中创建了一个“Main()”函数。我一直在关注C#中的游戏编程。当我运行示例时,一切正常,但是当我尝试制作自己的版本时,一切都无效。
这是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 :(得分:2)
表单的Load事件并不是启动游戏循环的最佳位置。 Load将被解雇有两个基本原因。 “好”的方式是它响应Show()调用而发生,通常出现在Program.Main()方法中。你的游戏循环会起作用。
“糟糕”的方式是表单构造函数中的代码要求表单的Handle属性有效。这迫使Winforms创建本机窗口并触发Load。仍然通常达到了良好的目的,可能性越低,它就越复杂。
因为Load事件处理程序没有返回,所以将出错。这意味着构造函数无法完成。这意味着窗口无法显示。这意味着“gameOver”永远不会成为现实。游戏结束。您可以使用调试器对此进行诊断,在Load事件处理程序上设置断点并查看“调用堆栈”窗口。期望您将在构造函数中看到导致问题的语句。
最后但同样重要的是,要对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
//...
}
答案 1 :(得分:0)
您可以尝试将循环逻辑放在静态void方法中并在线程上执行
这样它将以快乐的方式进行,表格将继续并加载