我正在和朋友一起尝试XNA 4.0,我们正在实施一个暗示切换屏幕的游戏,常见的东西,如MainMenu,GamingScreen,MultiplayerScreen等。
我遇到的问题是,仅在我的Windows7塔上,而不是在我朋友的任何计算机上,当我从主菜单切换屏幕时,我会看到一个紫色的死屏。我将以GamingScreen为例。
我们的Game1有一个currentScreen(ENUM WhichScreen)属性。它从MainMenu开始,在每次Draw和每次Update时,我们打开currentScreen来选择调用Draw和Update的屏幕。因此,当Game1.Update
和Game1.Draw
交替时,它可能按顺序排列如下:
MainMenuScreen.Draw
MainMenuScreen.Update
GamingScreen.Draw
GamingScreen.Update
GamingScreen.Draw
在MainMenuScreen s update, its components (homemade class) are updated, and it happens that
中,Game1.currentScreen`从MainMenu更改为Gaming。
但出于某种原因,在Draw()
上,最准确地在EndDraw()
(根据我的理解,GraphicsDevice.Present
),屏幕变为紫色。
我已经尝试了大量的调试方法并解析了这些论坛,但无济于事。暂停Draw(例如等待GamingScreen更新)是不够的,因为屏幕将再次变为紫色。
重要说明:我已将其设置为在GameingScreen dars之前MainMenuScreen绘制AND GamingScreen更新。发生的事情非常奇怪:它的MainMenu的画画引起了紫色的画面!
所以,我所处的位置是:从更新中的一部分到EndDraw()
的某个地方,在某一点上,后备缓冲器在没有明显原因的情况下自行拧紧,然后GamingScreen即使进入任何行动也是如此。
当屏幕变为紫色时,我检查并检测到this.UponDeactivate()
被调用。但是,拨打this.UponActivate()
并没有帮助我。
在pruple屏幕之后:
- 在Game1上仍然成功地调用了更新 - > GamingScreen,甚至覆盖紫色作品下隐藏的按钮(我得到按钮悬停的声音)
- 画面也被称为,但没有成功,因为屏幕保持紫色。
- 最小化窗口并重新打开窗口去除紫色并使其工作。这听起来非常重要,这就是我致电this.UponActivate()
的原因。
为了做一个总结,我不知道是什么原因导致后台缓冲区变得空虚。它必须通过单击按钮进行更改,但奇怪的部分是单击已经拧紧屏幕的方式。
很难给出重要部分中类之间调用的所有代码。在changeGameState之后,按钮完成了他的execute(),然后它的面板完成了更新,然后大面板本身更新了另一个面板。然后,我们回到了Game1的代码中,它只使用Update()
完成base.Update()
(我也尝试将base.Update()
置于更新的顶部,但无效),然后转到BeginDraw。稍后,EndDraw()
清空屏幕。
调用base.Update的顺序(Draw或Laft的第一个,更新的第一个或Update()
的最后一个)是否重要?
- >是什么导致后备人员像这样发疯?天啊,可以在Draw()
完成前拨打Update()
来拨打电话吗?或其他Update()
s?
非常感谢你的帮助!
答案 0 :(得分:1)
紫色屏幕表示未初始化的缓冲区。
调用SetRenderTarget
(包括null
,后备缓冲区目标)将清除您设置为该紫色的目标,除非该目标设置了RenderTargetUsage.PreserveContents
(具有性能)影响)。
通常,您需要设置渲染,以便首先渲染渲染目标,然后再渲染后备缓冲区。永远不要换回你之前吸引的缓冲区。
背面和前面的缓冲区也都是紫色的。因此,即使您没有使用渲染目标,如果您将缓冲区交换到前面(Present
,来自EndDraw
)而不实际绘制它,您将看到这一点。