C# Monogame - 如何在游戏窗口最小化时停止游戏循环

5
我正在开发一个全屏的Windows游戏。今天我看到一个独立游戏(使用XNA制作)有以下行为:当它是焦点窗口时,它会Update()Draw(),但当它被最小化时,它会停止这两个操作,并等待用户再次将其置于顶部。本质上,我正在寻找一种方法来“暂停”整个游戏循环,而当游戏再次获得焦点时,“从停止的地方”恢复它。这意味着如果我最小化我的游戏并打开浏览器,例如,当我左键单击时,游戏GUI逻辑不会注册并打开一个窗口或其他东西。谢谢!
1个回答

5

你可以有两种方法来实现。

方法1:使用Game.IsActive

IsActive如果游戏没有焦点或被最小化,则为false。因此,您可以在Game1.cs的Update循环中执行某些操作,例如:

if (this.IsActive) 
{
    // update your game components
}

方法二:订阅Game.ActivatedGame.Deactivated事件。

每当游戏失去焦点时,Deactivated事件会被触发。你可以在那里编写一些代码来暂停所有内容。如果你有一个暂停菜单,这是一个启动暂停菜单的好地方。每当游戏获得焦点时,Activated事件将被触发。你可以编写一些代码来取消暂停你的游戏。

在任何情况下,你只需要暂停更新,而不是绘制。如果看一下Draw()函数,它会清除后台缓冲区并在每一帧重新绘制所有内容。如果Draw()被暂停,你的游戏将出现卡顿。Draw()函数不应该改变游戏的状态。


1
你能否就为什么我只应该暂停“Update()”给出一些评论?我的意思是,只有当我在“Update()”中进行检查时,它才起作用,但为什么我不应该在“Draw()”中检查它? - PowerUser
2
如果您的 Draw() 代码仅绘制物体,则它不会改变游戏的状态,因此不需要被暂停。 - libertylocked
1
就游戏而言,当不在前台时停止绘制是更加“友好”的,因为这是消耗最多CPU周期(以及移动设备上的电池寿命)的操作。或者大大降低帧率。(并在最小化时完全停止绘制)。两个词:“Max-Q笔记本电脑”。即使是高端游戏也不能假定没有人会尝试在未插电的笔记本电脑上运行它。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接