XNA项目 - 谁负责绘图?

时间:2009-04-23 14:27:08

标签: xna

我正在玩XNA,我需要在每个帧中绘制几个不同的模型。 此时,Game对象保存对我所有模型的引用,并依次绘制它们。每个都有自己不同的绘图方式 - 一个有两个单独的纹理,另一个可能镜像到另一边等。

我想知道是否可以添加

public void Draw(SpriteBatch spriteBatch)

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

有没有首选的方法呢?

2 个答案:

答案 0 :(得分:5)

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

然后,我有一个DrawableGameComponent充当我的场景图。它包含所有活动actor对象的列表。在组件的Draw和Update方法中,我遍历actor的列表并调用它们的Draw和Update方法。

答案 1 :(得分:3)

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

一个例子......说你有很多船。有些人跑得快,有些人用火箭射击,有些人围着它运行的卫星也在射击。您的“实体”类可以具有以下属性

  • Model VisualRepresentation
  • 矩阵位置
  • 实体[] AttachedEntities

您的渲染器可以迭代您的通用“List<Entity>”和

  1. 使用位置
  2. 绘制实体的视觉表示(即模型)
  3. 遍历AttachedEntities并绘制它们(递归地)。
  4. 这显然是一个简化的例子......但是这样绘图逻辑完全包含在渲染代码中,并且只需要关注尽可能少的信息。虽然船级可以专注于游戏逻辑本身(即我的飞行速度有多快,我使用的是什么武器,我的盾牌有多少能量等等)。

    至于哪一个是首选,实际上答案在于您的项目要求,以及您感到满意的内容。在制作游戏之前不要试图制作游戏引擎......只要做任何事情来制作你的游戏,然后也许你可以提取之后的组件>你发运游戏:-P