C++ 游戏屏幕管理

C++ 游戏屏幕管理,c++,game-engine,C++,Game Engine,我正在为一个微型游戏引擎开发一个屏幕管理器,到目前为止,我无法找到一个不使用每个屏幕的“blob”来管理屏幕对象的正确解决方案。BLB在这样的情况下是可容忍的吗?我需要一个控制器中的可渲染对象列表。 < P>我会考虑在这种情况下使用。否则,如果你不小心的话,很容易会得到一堆意大利面代码,屏幕代码会进入游戏代码,反之亦然。我最近编写了一些你可能会称之为“屏幕管理器”的代码 我一开始的想法是,无论我做什么游戏,渲染系统在如何渲染(如何管理硬件)方面都几乎是一样的。改变的是渲染什么,以及如何绘制它(我

我正在为一个微型游戏引擎开发一个屏幕管理器,到目前为止,我无法找到一个不使用每个屏幕的“blob”来管理屏幕对象的正确解决方案。BLB在这样的情况下是可容忍的吗?我需要一个控制器中的可渲染对象列表。

< P>我会考虑在这种情况下使用。否则,如果你不小心的话,很容易会得到一堆意大利面代码,屏幕代码会进入游戏代码,反之亦然。

我最近编写了一些你可能会称之为“屏幕管理器”的代码

我一开始的想法是,无论我做什么游戏,渲染系统在如何渲染(如何管理硬件)方面都几乎是一样的。改变的是渲染什么,以及如何绘制它(我想要一个框、一个圆还是一个位图..表示什么…等等)

因此,基本上,“游戏状态”负责知道如何渲染自己,并且在屏幕管理器或图形系统提供渲染表面时应该这样做(它还应该负责知道输入、物理等如何作用于自身)

我用GraphicsSystem对象的单例实现了它,它被称为类似这样的东西:

GameState gs;
Graphics::System().Init(DOUBLE_BUFFER, 640, 480);
...
while(still_looping) {
    ...
    // When it is time to render:
    Graphics::System().RenderGameState(&gs);
}
您会问,Graphics::System()singleton如何知道如何呈现游戏状态?它知道,因为游戏状态是从图形系统公开的侦听器继承的

//within GraphicsSystem.h...
class BaseRenderer
{
public:
    virtual void Render(BITMAP *render_surface) = 0;
};

//GameState defined with:
class GameState : public BaseRenderer
{
public:
    void Render(BITMAP *render_surface);
    ...
几乎所有的子系统都可以这样做。。。(可能不是计时,因为这是游戏循环中需要的)

为什么是单身?它是C++,我假设只有1个屏幕,或者图形子系统。我不确定你是在使用多个屏幕,还是手机或控制台。另一种方法是将图形系统作为静态全局变量放在一个单独的文件中,只给它们文件范围,并在该文件中包含访问器函数(我以前的C方式)

但关键是封装。让您的屏幕管理器管理硬件。让你的游戏状态决定它应该如何表达


如果这没有抓住要点,请澄清您的问题,我可以编辑答案。

Blob?原谅我,但是你说的blob是什么意思?每个屏幕都必须由不同的所需资源管理组件组成,因此在你的情况下,每个屏幕都可以有一个可渲染对象管理器对象,它封装和管理所有的可渲染对象,并进行FRUSTUM剔除等。。我不太明白你在寻找什么答案,你想为你的屏幕和管理层建立一个结构,还是想知道你是否可以管理它?问题是:既然blob通常是避免反模式的,那么这是一个坏主意还是一个适合屏幕管理器的方法?是否有更好的方法来管理屏幕上的内容,或者blob是可接受的还是必需的?好的,我理解,要说您的实现是否不足,您首先需要解释并展示一些代码和结构的示例,“blob”本身并没有解释你是如何构建的,因为你链接的God_object wiki页面也提到了缺乏任何类型的子例程。现在我确信你的结构在不知道的情况下会有一定程度的抽象,很难对其进行评论。你的回答很有趣,虽然我已经设置了代码(并在这一点上工作),但我只是想知道这是不是一个好主意,如果不是,你将如何管理当前正在渲染的对象。例如,迈克所说的就是我问题的答案。谢谢!这正是我到目前为止一直要求的。我已经完全忘记了模式,但似乎我已经下意识地设法将其融入到代码中。谢谢你给我指路,这就是我想要的!