4

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

4

2 回答 2

5

执行此操作的正确方法是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()

就个人而言,我会简单地绘制每一帧。

于 2010-10-30T03:55:57.290 回答
2

您不需要从 Game 类继承,它完全是可选的。您可以编写自己的类,仅在需要时重绘屏幕。不过,该类中有一些有用的代码,因此您可以使用 Reflector 从那里复制代码,然后更改其逻辑。

于 2010-10-30T13:03:19.790 回答