gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:52:28 25 4
gpt4 key购买 nike

我为一项学校作业创建了一个小游戏,它分为 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() 并将其终止设置为 true 即可完成,这也按预期工作。现在我的问题是当用户单击表单关闭按钮或按 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);

我不知道为什么当我按下刚刚终止游戏的按钮时它会起作用,为什么当表单关闭时它不起作用,它是相同的方法调用。

如果我先按按钮,然后按 F4,表单就会完美关闭,只是当我按 F4 时,我不断收到此消息。

有什么想法吗?

最佳答案

您的主要错误(IMO)是您自己创建游戏循环并调用Application.DoEvents。相反,您应该让正常的 UI 事件循环本身运行(通过 Application.Run(form)),并为动画等添加计时器。WinForms 设计为以事件驱动的方式运行。

失败的原因是您尝试在表单实际关闭后进行绘制 - 即您正在无效的Graphics句柄上进行绘制。当按下“终止”按钮时,我假设您实际上并没有关闭表单,因此不存在问题。

一个快速而肮脏的技巧是添加另一个:

if (terminated)
break;

在最后一次调用 Application.DoEvents 之后,在尝试在 Graphics 上绘图之前 - 但这并没有解决您有效尝试的更基本方法以一种并非真正设计的方式使用 WinForms。

关于当表单关闭事件被触发时关闭我的小游戏的 C# 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1282598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com