3

我只是在玩 XNA,我需要在每一帧中绘制几个不同的模型。目前,Game 对象持有对我所有模型的引用,并一个接一个地绘制它们。每个人都有自己不同的绘画方式——一个有两个独立的纹理,另一个可能镜像到另一侧,等等。

我想知道是否可以只添加一个

public void Draw(SpriteBatch spriteBatch)

方法到我的所有模型(当然来自 BaseModel),并让每个类负责绘制自己,或者我应该坚持让类根据 Update 方法上的事件(KeyboardState)设置它们的数据,并保持Game 类中的所有图形逻辑。

有没有首选的方法来做到这一点?

4

2 回答 2

5

通常,我有一个基类,其中包含 BaseModel、纹理数据、旋转和缩放数据等。对于游戏中的每种类型的演员,我创建一个派生类。基类提供了一个 Draw 方法,默认情况下,该方法使用类中给出的纹理、旋转和缩放数据来绘制模型。派生类可以覆盖它以绘制他们喜欢的演员。

然后,我有一个 DrawableGameComponent 作为我的场景图。它包含所有活动参与者对象的列表。在组件的 Draw 和 Update 方法中,我遍历演员列表并调用他们的 Draw 和 Update 方法。

于 2009-04-23T14:45:19.080 回答
3

这是接近它的一种方法……为了本文的完整性,我将重点介绍另一种方法。基本上,相反的观点指出,没有一个实体应该需要(或拥有)如何呈现自己的自定义知识。实体只是状态的集合......渲染器可以简单地查看该状态,并以正确的方式绘制它。

一个例子……假设你有很多船。有些跑得快,有些发射火箭,有些有卫星围绕它运行,它也可以发射。您的“实体”类可以具有以下属性

  • 模型视觉表示
  • 矩阵位置
  • 实体[] 附加实体

然后,您的渲染器可以遍历您的通用“ List<Entity>”,并且

  1. 使用位置绘制实体的视觉表示(即模型)
  2. 循环遍历 AttachedEntities 并(递归地)绘制它们。

这显然是一个简化的例子……但是这样绘制逻辑完全包含在渲染代码中,并且只需要尽可能少地关注自己的信息。虽然船类可以专注于游戏逻辑本身(即我的飞行速度、我使用的武器、我的盾牌中有多少能量等)。

至于哪个是首选,真正的答案在于您的项目要求,以及您觉得舒服的内容。不要在制作游戏之前尝试制作游戏引擎……只要尽一切努力制作你的游戏,然后也许你可以提取在你发布游戏工作的组件:-P

于 2009-04-24T13:42:00.647 回答