XNA项目 - 谁负责绘图?

3
我正在使用XNA进行尝试,并且我有几个不同的模型需要在每个帧中绘制。 目前,Game对象持有对所有模型的引用,并逐个绘制它们。每个模型都有自己不同的绘制方式 - 其中一个具有两个单独的纹理,另一个可能被镜像到另一侧等等。
我想知道是否可以将public void Draw(SpriteBatch spriteBatch)方法添加到所有模型中(当然是从BaseModel开始),并让每个类负责绘制自己,或者我应该坚持让类根据Update方法上的事件(KeyboardState)设置其数据,并将所有图形逻辑保留在Game类中。
有没有推荐的做法?
2个回答

5

一般来说,我有一个包含BaseModel、纹理数据、旋转和缩放数据等的基类。对于游戏中每种类型的角色,我创建一个派生类。基类提供了一个Draw方法,通过默认方式使用给定类中的纹理、旋转和缩放数据绘制模型。派生类可以重写它以任何希望的方式绘制角色。

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


3
这是一种方法...为了完整性,我将强调另一种方法。基本上,相反的观点认为没有任何实体需要(或应该)具有自定义知识来呈现自己。一个实体只是一个状态集合...渲染器可以简单地查看该状态,并以正确的方式绘制它。
例如...假设您有许多船只。有些快速行驶,有些发射火箭,有些有围绕其轨道的卫星也会发射。您的“实体”类可以具有以下属性
- 模型可视化表示 - 矩阵位置 - 实体[]附加实体
然后,您的渲染器可以迭代通用的"List<Entity>",并且
1.使用位置绘制实体的可视化表示(即模型) 2.循环附加实体并绘制它们(递归)。
显然这是一个简化的例子...但是这种方法的绘图逻辑完全包含在渲染代码中,只需要关注尽可能少的信息。而船只类可以专注于游戏逻辑本身(即我飞得有多快,我使用什么武器,我的护盾中有多少能量等)。
至于哪种方法更受欢迎,真正的答案取决于您的项目要求以及您感觉舒适的方式。不要在制作游戏引擎之前制作游戏...只需尽一切可能制作游戏,然后也许您可以在发货后提取有效组件:-P

谢谢你对事情的另一种看法。 - Noam Gal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接