首页 文章

AS3中面向对象的编程

提问于
浏览
1

我正在用as3制作一个游戏,它有球移动并从墙上弹起 . 当用户点击爆炸时,任何击中爆炸的球也会爆炸 . 任何击中爆炸的球都会爆炸,等等 .

我的问题是什么是最好的球类结构 . 我有一个水平系统来控制水平等等,我已经想出了一些工作方式来编码球 . 这就是我所做的 .

我的第一次尝试是创造一个运动,弹跳,爆炸和最终Orb的课程 . 这些都按我命名的顺序相互扩展 . 我得到它的工作,但有Bounce扩展运动和爆炸扩展Bounce,它似乎不是非常面向对象,因为如果我想添加一个没有移动,但确实爆炸的盒子类怎么办?我需要一个单独的类来爆炸 .

我的第二次尝试是创造运动,弹跳和爆炸而不扩展任何东西 . 相反,我将Orb类的引用传递给每个 . 然后,类根据Orb调度的事件(如更新)来存储引用并执行它需要执行的操作,更新是从Orb每个输入帧广播的 . 当时间到来时,这将驱动运动和弹跳以及爆炸 . 这种尝试也起作用,但它似乎并不正确 .

我也考虑过使用Interfaces,但因为它们更像是一个类的大纲,我觉得代码重用就像窗口一样,因为每个类都需要自己的特定任务代码,即使该任务完全相同 .

我觉得好像我正在为as3不支持的类搜索某种形式的多重继承 .

有人可以向我解释一个更好的方法来做我正在尝试做的事情吗?我是否因为运动,弹跳,爆炸和宝珠而被归类为“面向对象”?接口是否可行?任何反馈表示赞赏!

3 回答

  • 2

    任何引擎或框架的一个重要规则是,无论您使用何种继承或任何实际使用,它都应该完全是可选的,以便引擎处理实体 . 因此,虽然引擎处理的具体实体可能使用复杂的继承,但引擎完全透明,因为它们被抽象为接口 .

    例如,您定义了一个接口 IMovable . 引擎可以处理这个并移动这些对象 . 然后你可以提供一个默认的实现,比方说 MovableBase ,它可以但不需要通过继承或组合由其他实体重用 .

    还请注意,通常认为该组合比继承更好,更清洁 . 过度使用继承经常导致违反Liskov substitution principle,这是5 SOLID原则之一 . 你可以找到很多关于inheritance vs. composition on Google的文章 .

    通常使用中的继承实际上倾向于破坏许多OOP原则并引入大量依赖 . 它通常被认为是OOP中的一个基本概念,但如果您将其视为实现代码重用的众多方法之一,那么您会感觉更好 .

    因此,不必费心解决问题,如何构建特定组件,首先需要抽象它们以便能够应用dependency inversion principle . 这样,您将获得具有极度失去耦合的架构 . 如果一个实体被证明是不必要的复杂,或者你发现,你可以提取一些代码以便重用,或者你需要重新安排你的继承机制,那么其他代码就不会受到影响 .

    你可能会发现,实际上试图将你的实体分成多层继承只会有点意义,因为事情变得不必要的冗长和奇怪的交织 . 但是,抽象实体的不同"aspects"或"roles",例如 IMovableIBounceableIExplodable 等,将会有所帮助 . 任何实体可以选择随意实现任何接口,因此将由引擎相应地处理 .

    软件设计中最重要的一步是设计一种架构,其中不同的模块从根本上分开并通过窄接口进行交互 . 当模块变大时,然后对它应用相同的步骤,并将其重构为子模块(您可以这样做,而不必担心软件的其余部分,只是因为模块被很好地封装) . 当它看起来不自然时,不要试图将整体分成几部分 . 您将获得更多灵活的代码 .

    格尔茨
    back2dos

  • 0

    Gidday,

    这个让我想起了不久前我读过的一个例子,它使用了几乎相同的类名作为你的例子!如果它可以帮助你找到答案,我会记得这本书是Ed出版的朋友,被称为“面向对象的动作脚本”,尽管它是针对AS2的,但AS3中的概念是相同的 .

    除了那本书之外,在我关于设计模式的读物(un / flame意志,人们)中,听起来像Factory pattern可以用来生成从标准对象生成的不同对象,因为你可以根据需要覆盖细节 . 维基百科上的第一段解释就是这么简单,图表也很有帮助 .

    -d

  • 0

    我认为你正在寻找像PushButton Engine那样的东西:使用实体和组件 . 这个概念是,你有一个Entity类(Orb),它可以包含orb的属性(可能是位置和大小),也可能是你的渲染代码 . 然后你有你的实体类的组件类(运动,弹跳,爆炸) .

    alt text http://img.skitch.com/20100528-kph48r4t1bb73tuk8rq4b2u5f5.jpg

    组件应仅包含它们应该执行的功能(即,Bounce组件应仅处理Bounce的时间/位置,而不是每帧都移动Orb) . 他们还应该直接访问其所有者(Entity)类 . 例如,他们可以修改属性(移动,弹跳)或调用它上的爆炸 .

    然后,您可以使用Factory模式来创建单独的Factory类,该类用于创建实体并将适当的组件附加到这些实体 .

相关问题