我正在用as3制作一个游戏,它有球移动并从墙上弹起。当用户点击爆炸时,任何击中爆炸的球也会爆炸。任何撞击爆炸的球都会爆炸等等。
我的问题是什么是最好的球类结构。我有一个水平系统来控制水平等等,我已经想出了一些工作方式来编码球。这就是我所做的。
我的第一次尝试是创造一个运动,弹跳,爆炸和最终Orb的课程。这些都按我命名的顺序相互扩展。我得到它的工作,但有Bounce扩展运动和爆炸扩展Bounce,它只是似乎不是面向对象,因为如果我想添加一个没有移动,但确实爆炸的盒子类怎么办?我需要一个单独的类来爆炸。
我的第二次尝试是在不扩展任何东西的情况下创造运动,弹跳和爆炸。相反,我将Orb类的引用传递给每个。然后,类根据Orb调度的事件(如更新)来存储引用并执行它需要执行的操作,更新是从Orb每个输入帧广播的。当时间到来时,这将驱动运动和弹跳以及爆炸。这种尝试也起作用,但它似乎不正确。
我也考虑过使用Interfaces,但因为它们更像是一个类的大纲,我觉得代码重用就像窗口一样,因为每个类都需要自己的特定任务代码,即使该任务正是如此相同。
我觉得我正在为as3不支持的类搜索某种形式的多重继承。
有人可以向我解释一下我做某事的更好方法吗?我是否因为运动,弹跳,爆炸和宝珠而被归类为“面向对象”?接口是否可行?任何反馈都表示赞赏!
答案 0 :(得分:2)
任何引擎或框架的一个重要规则是,无论您使用什么类型的继承或任何实际使用,它都应该是引擎处理实体的完全可选项。因此,虽然由引擎处理的具体实体可能使用复杂的继承,但它对引擎来说是完全透明的,因为它们被抽象为接口。
例如,您定义了一个接口IMovable
。引擎可以处理这个并移动这些对象。然后你可以提供一个默认实现,比方说MovableBase
,它可以但不需要通过继承或组合由其他实体重用。
请注意,通常认为构图比继承更好更清洁。过度使用继承通常会导致违反Liskov substitution principle,这是SOLID原则之一。你可以找到很多关于inheritance vs. composition on Google的文章。
通用的继承实际上往往会破坏许多OOP原则并引入很多依赖。它通常被认为是OOP中的一个基本概念,但如果您将其视为实现代码重用的众多方法之一,那么您会感觉更好。
因此,您不必费心解决问题,如何构建特定组件,首先需要抽象它们以便能够应用dependency inversion principle。这样,您将获得具有极度失去耦合的架构。如果一个实体被证明是不必要的复杂,或者你发现,你可以提取一些代码以供重用,或者你需要重新安排你的继承机制,那么其他代码就不会受到影响。
你可能会发现,实际上试图将你的实体分成多层继承只会有点意义,因为事情变得不必要的冗长和奇怪的交织。但是,抽象实体的不同“方面”或“角色”,例如IMovable
,IBounceable
,IExplodable
等,将会有所帮助。任何实体都可以随意选择实现任何接口,因此将由引擎进行相应处理。
软件设计中最重要的一步是设计一种架构,其中不同的模块从根本上分开并通过窄接口进行交互。当一个模块变大时,然后对它应用相同的步骤,并将其重构为子模块(你可以这样做,而不必担心软件的其余部分,只是因为模块被很好地封装)。当它看起来不自然时,不要试图将整体分成几部分。您将获得更多灵活的代码。
格尔茨
back2dos
答案 1 :(得分:0)
Gidday,
这让我想起了不久前我读过的一个例子,它使用了几乎相同的类名作为你的例子!如果它可以帮助你找到答案,我会记得这本书是Ed出版的朋友,被称为“面向对象的动作脚本”,尽管它是针对AS2的,但AS3中的概念是相同的。
除了那本书之外,在我关于设计模式的读物(un / flame意志,人们)中,听起来像Factory pattern可以用来生成从标准对象生成的不同对象,因为你重写你需要的细节。维基百科上的第一段解释就是这么简单,图表也很有帮助。
-d
答案 2 :(得分:0)
我认为你正在寻找像PushButton Engine那样的东西:使用实体和组件。概念是,您有一个Entity类( Orb ),它可以包含orb的属性(可能是位置和大小),也可能包含渲染代码。然后,您将附加的组件类(移动, Bounce , Explosion )添加到您的实体类。
alt text http://img.skitch.com/20100528-kph48r4t1bb73tuk8rq4b2u5f5.jpg
组件应仅包含它们应该执行的功能(即,Bounce组件应仅处理Bounce的时间/位置,而不是每帧都移动Orb)。他们还应该直接访问其所有者(Entity)类。例如,他们可以修改属性(移动,弹跳)或调用它上的爆炸。
然后,您可以使用Factory模式创建一个单独的Factory类,用于创建实体并将适当的组件附加到这些实体。