游戏开发中类设计的正确的面向对象方法是什么?


31

我正在使用XNA为Windows 7 Phone开发基于2D Sprite的游戏。提供的培训和教程非常有帮助,但是我面临的问题是,他们每个人对类设计的处理方式都不相同,并且代码的结构也不太好。结果,我很难很好地理解我应该对特定班级承担的责任。

例如,我可以有一个基本的Sprite类BaseSprite,它知道如何绘制自身,检查碰撞等。然后,我可以拥有一个AnimatedSprite类,该类将知道如何导航其Sprite表,一个ExplodingSprite类,等等。Windows 7 Phone Jumpstart会话2资料中的Space Invaders示例演示了此技术。

或者,我可以将大部分渲染和运行游戏职责放在一个GameScreen类中;就其职责而言,该类及其派生类的行为更像表单或网页。Sprite类是更简单的容器,逻辑更少。

这是Windows 7 Phone Training Kit的Alien Sprite游戏和其他游戏状态管理器示例中使用的技术。

游戏开发中类设计的正确的面向对象方法是什么?

Answers:


26

我确实使用了一种更加面向组件的方法,在这种情况下,您将拥有一个Sprite类,该类具有诸如Visual,Collision,Animation,Input等组件。使用这种方法,我最终不会拥有更深的类层次结构(这很好) 。

有关面向组件设计的一些信息,请参见此处


2
+1链接到的文章太棒了。我非常关注纯OO设计,因此完全忽略了组件/装饰器类型模型。
乔什E

1
组件模式并不是真的“不够纯净” OO :)
Srekel

2
确实。OO通常等同于继承。但是继承只是OO提供的一种工具,组合是另一种工具。
haffax

就是这样 我的措词应该更精确;我的意思是,我专注于OO的继承方面,而不是考虑可以帮助我实现所需目标的OO设计模式/其他OO方面。
Josh E

尽管基于组合的方法非常明显并且经常使用,但是我还没有看到一种使渲染组件可移植的解决方案。任何提示都会很棒。
安德烈亚斯(Andreas)


6

SOLID原则适用于尽可能多的游戏代码设计为其他任何职业-至少要等到你来进行优化,所以我会用你的第一个例子作为出发点。

不过,我会走得更远,因为BaseSprite听起来好像有成为超级类的趋势。单一责任原则规定,碰撞,渲染和导航应全部由组件处理,而不是由类层次结构中的单个条目处理。所有这些组成部分的持有人只能处理它们之间的推动世界位置。


5

在最后几个项目中,我更加倾向于MVC风格的方法。

起初,我们不确定这是否行得通,但它确实运行良好。

模型

数据对象。只是纯数据。无行为,无渲染。

数据管理员。仅处理数据对象的“列表”。(也可以增强以支持合并。)

视图

我们称它们为渲染器。对于每种数据对象类型,都有一个渲染器。当与管理者调用时,它将呈现该列表中的所有对象。

控制者

与渲染器相同,但控制行为。

ShipManager具有船舶列表。ShipController将根据船的状态移动船。ShipRenderer将根据船舶的状态进行渲染。

为什么

这样,视图和逻辑就严格分开了。这使得移植到新平台变得非常容易。在XxxManager中优化数据布局也非常容易。


2
我之所以拒绝您,是因为我厌倦了看到或多或少的裸露“使用MVC”作为可接受的答案。如果您正在任何现代平台上进行开发,那么您已经在多个级别上使用了MVC。这不是一个具体的答案,也不是一个好的答案,因为它实际上并没有告诉人们如何构造类,而类是特定于任务/领域的。最后,很多人都在写“类Modal ...;类View ...;类控制器...”。在谈论现有代码时,MVC是一种具有许多高级解释能力的模式。这不是具有良好计划能力的模式。

4
@Joe我明白你的意思,但是发现你选择的话是不必要的粗鲁。我只是解释了我们如何做到的。由于较高级别的体系结构选择使较低级别的设计选择已过时,因此我认为这是一个有效的答案。
安德里亚斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.