1

当我使用 opengl、direct3d、sdl 或任何图形 api(通常是游戏)编写任何类型的应用程序时,我习惯于创建一个名为 Graphics 的类,该类具有绘制、加载图像、初始化窗口等所需的一切。在里面。在另一个类中存在这个类的一个实例,即程序、游戏或任何将使用它的主类。

随着岁月的流逝,我尝试了很多不同的方法来使用它,我想知道你们是否认为其中一些是好的,或者如果一切都只是无用的废话,我应该用另一种方式来做。

1 - 在程序类中有一个 Graphics 的实例,并在程序类中有一个函数来迭代对象(游戏对象,例如玩家)并调用 Graphics 方法以相应地绘制所有内容。

2 - 将指向 Graphics 的指针传递给每个对象,这样每个对象都可以有一个 Draw 函数,并通过这个指针自己调用适当的 Graphics 函数。

3 - 让 Graphics 中的所有内容都是静态的,并且无需创建图形实例。然后你可以从任何地方调用每个图形函数。(你只需要一个 Draw 函数到每个对象,就像主题 2 一样)

谢谢你。

编辑:如果我做一些类似于 iostream 对 cout 所做的事情,比如,只需使用“extern Graphics x;”创建一个标头,在 cpp 文件中声明 x,然后从这个 x 中调用所有内容。这太糟糕了吗?如果是,为什么?

4

3 回答 3

2

好吧,我认为“图形”类可以很好地具有状态,例如,它正在绘制的画布。因此,使它成为一个类是好的;通过创建一个类,您可以使相同的功能集适用于不同类型的“画布”(opengl、directx、sdl 等)

在您的选项中,我认为选项 1 是最好的,但选项 2 将是最简单的(选项 3 很糟糕,因为它使代码依赖于全局变量,从而消除了代码的可重用性 - 这是黑客方法:D )。

选项 1 很棒,因为您可以编写一个图形引擎,用它绘制的东西做智能的东西:假设您有两个共享相同纹理的对象,但使用不同的网格。如果编程得当,图形引擎可以使用相同的渲染设置调用两个对象的“绘制网格”函数,在这种情况下是相同的纹理,从而加快渲染速度。这对于选项 2 是不可能的,它通常将单个对象的绘制函数组合在一起,从而导致对渲染设置进行更多更改。

然而,选项 2 更容易实现。如果您不需要很高的渲染速度,我会选择这个,因为它的工作量要少得多,并且会导致更合乎逻辑的程序结构。要实现选项 1,就像我解释的那样,对象需要具有“渲染属性”等,需要由渲染引擎匹配,以及针对不同绘制设置的不同绘制例程......与对象相比非常复杂 - draw 函数,它只使用一组中央绘图函数,如 Graphics 类。

因此,如果您选择“大型项目”,请选择选项 1。为了快速获得结果,并且如果您不需要绘制很多东西,选项 2 可能会更好。选项 1 和 2 的可用性相似。

PS:抱歉编辑晚了,但我的语法在以前的版本中很糟糕

于 2013-02-08T17:52:51.090 回答
1

我会选择第四个选项,使 Graphics 成为命名空间,而不是类。

听起来 Graphics 不是一种数据类型,只是函数的集合。这正是命名空间的用途。

于 2013-02-08T17:24:09.280 回答
1

我很难弄清楚什么是“图形”对象。软件中的对象类似于现实生活中的对象,那么 Graphics 对象代表什么?

我通常这样做的方式与标准 UI 应用程序没有太大区别:我有一个可以多次实例化的 Window 类和一个从 Window 继承且只实例化一次的 MainWindow 类。在那个 MainWindow 类中,我拥有将在整个执行过程中使用的所有图形资源(例如 Direct3D 设备对象)。

于 2013-02-08T17:30:27.227 回答