30

将渲染代码与实际游戏引擎/逻辑代码分开的最佳方法是什么?把它们分开是个好主意吗?

假设我们有一个名为 Knight 的游戏对象。骑士必须在屏幕上呈现给用户才能看到。我们现在有两个选择。要么我们给 Knight 一个Render/Draw我们可以调用的方法,要么我们创建一个渲染器类来负责渲染所有的骑士。

在将两者分开的情况下,Knight 是否应该仍然包含渲染他所需的所有信息,或者这也应该分开?

在我们创建的上一个项目中,我们决定让渲染对象所需的所有信息都存储在对象本身中,但是我们有一个单独的组件来实际读取该信息并渲染对象。该对象将包含诸如大小、旋转、缩放以及当前正在播放的动画等信息,并且基于此渲染器对象将组成屏幕。

像 XNA 这样的框架似乎认为加入对象和渲染是一个好主意,但是我们害怕被绑定到特定的渲染框架,而构建一个单独的渲染组件可以让我们在任何给定的时间更自由地更改框架。

4

3 回答 3

21

我会创建一个单独的KnightRenderer类。好处:

  • 游戏逻辑和渲染之间的清晰分离。他Knight自己甚至可能在游戏服务器上运行,而对渲染一无所知。
  • 更小、更简单的类,只关注一项功能。

所有KnightRenderer需要了解的Knight(职位、状态)都必须在Knight.

特定于渲染的属性将进入KnightRenderer该类。例如,也许你想让骑士在被击中时闪烁,所以你需要存储一个计数器或时间值。

于 2010-05-03T07:35:48.037 回答
7

我知道我来晚了,但对于未来的读者,你可能会对我写的教程感兴趣。

我不是真正的专家,但这就是我认为适当分离关注点的方式:http:
//aurelienribon.wordpress.com/2011/04/26/logic-vs-render-separation-of-concerns/

替代文字

于 2011-01-17T13:57:56.547 回答
6

我会努力使您的对象尽可能通用,并尽可能避免将游戏事实编码到您的代码中。

例如,您有一个 Entity 或 Object 或 Actor 类,并且该类有一个指向其决策制定(其 AI)的指针和一个指向其图形表示的指针。

它的决策必然与游戏性事实相结合;事实上,它游戏事实的一部分。因此,您可以将决策者命名为“KnightAi”或其他名称。

另一方面,图形表示只是一点图形。它将与其他所有实体一样绘制。你有一个模型或一些位图和一些动画或没有......这将/可以称为“模型”之类的东西,并将加载它被告知加载定义实体对玩家的外观的信息。在渲染您的骑士、马和城堡时,您可能会发现它们都使用不同的数据做同样的事情。他们拥有的数据种类甚至都相同,只是内容不同。

假设您的实体都表示为圆圈。你只需让它们指向一个 CircleRenderer,它采用了它们应该被绘制的大小。您不会为您想要的每个不同大小(或颜色或其他)的圆圈创建不同的渲染器类!

于 2010-05-03T18:47:29.750 回答