当表单结束事件被触发时关闭我的小游戏的C#问题

时间:2009-08-15 19:16:09

标签: c# gdi+

我为学校作业创建了一个小游戏,它分为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的时候我会继续这样做。

有什么想法吗?

2 个答案:

答案 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;