手动控制何时重绘屏幕

我正在尝试为XNA制作一个回合制的roguelike引擎。 我基本上是使用一个名为libtcod的基于SDL的roguelike库完成之前的工作来移植游戏。 如何修改基本的XNA模板,使游戏不会每帧重绘屏幕,而是在我想要的时候?

执行此操作的正确方法是每当要将后缓冲区绘制到屏幕上时调用GraphicsDevice.Present()

现在困难在于Game类会自动为你调用Present(特别是在Game.EndDraw ),这是你不希望它做的事情。 幸运的是, Game提供了许多方法来阻止调用Present:

最好的方法是覆盖BeginDraw并让它返回false,以防止绘制帧(包括阻止调用DrawEndDraw ),如下所示:

 protected override bool BeginDraw() { if(readyToDraw) return base.BeginDraw(); else return false; } 

其他选择是调用Game.SuppressDraw ,或者覆盖EndDraw ,使得它不会调用base.EndDraw()直到您准备好在屏幕上显示一个框架。

就个人而言,我只想画每一帧。

您不需要从Game类inheritance,它完全是可选的。 您可以编写自己的类,只在您需要时重绘屏幕。 虽然在类中有一些有用的代码,所以你可以使用Reflector从那里复制代码然后改变它的逻辑。