我为学校作业创建了一个小游戏,它分为2个不同的项目,一个带有表单的项目和一个带有包含游戏的DLL文件。
游戏循环非常简单,如下所示:
private void GameLoop(Graphics g)
{
int lastTick = Kernel32.GetTickCount();
do
{
if (terminated)
break;
while ((lastTick + 50) > Kernel32.GetTickCount())
Application.DoEvents();
while (gamePaused)
Application.DoEvents();
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 800, 640);
DrawWalls(g);
MoveMonsters();
DrawMonsters(g);
lastTick = Kernel32.GetTickCount();
}
while (true);
gameRunning = false;
}
它按预期工作,并重新绘制表单页面上的面板。在表单页面上,我有一个退出当前游戏的按钮,这只是通过调用game.dll的命令TerminateGame()巫婆集终止为真的主窗体完成,这也按预期工作。 现在我的问题是用户点击表单关闭按钮或按F4。
然后我试着做同样的事情:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (game.IsRunning)
game.TerminateGame();
}
但后来我不断收到此错误: GDI +中发生了一般错误。 它指向这一行: g.FillRectangle(new SolidBrush(Color.White),0,0,800,640);
我不知道为什么当我按下刚刚终止游戏的按钮以及为什么它在Form关闭时不能正常工作,它的工作方式相同。
如果我先按下按钮然后按F4,表格就会完美关闭,就在我按F4的时候我会继续这样做。
有什么想法吗?
答案 0 :(得分:6)
您的主要错误(IMO)是自己创建游戏循环并调用Application.DoEvents
。相反,您应该让普通的UI事件循环本身运行(通过Application.Run(form)
,并为动画等添加计时器.WinForms旨在以事件驱动的方式运行。
一个失败的原因是因为你在表单实际关闭后尝试绘制 - 即你正在使用无效的Graphics
句柄。当按下“终止”按钮时,我假设您实际关闭了表单,因此没有问题。
快速而肮脏的黑客将是添加另一个:
if (terminated)
break;
在最后一次调用Application.DoEvents
之后,在尝试使用Graphics
之前 - 但是这并没有解决你以某种方式有效地尝试使用WinForms的更基本方式真的是为。而设计的。
答案 1 :(得分:0)
您需要等待游戏循环终止。如果不这样做,那么在已经处理了各种图形对象之后代码将被执行,这会引发您正在接收的异常。要解决此问题,请等待游戏循环终止,然后让您的应用程序终止。
像
if (game.IsRunning)
game.TerminateGame();
while (game.IsRunning)
Continue;