Actionscript 3 中的接口和游戏架构

Posted

技术标签:

【中文标题】Actionscript 3 中的接口和游戏架构【英文标题】:Interfacing and Game Architecture in Actionscript 3 【发布时间】:2014-01-22 20:23:48 【问题描述】:

我正在 Starling 框架中为我的新点击游戏创建架构。它的大小设置得很大,所以我试图确保使用最佳的面向对象实践来确保我不会 A) 重复相同的方法。 B) 保持可持续和清洁。

我不知道接口是一种收缩所有类的方式。保持一切一致并确保子类具有正确运行的方法。让我们看一个我创建的播放器类的示例。

public interface IPlayer 
   function changeDirection():void;
   function walkToPosition():void;
   function pickUpItem():void;


class AbstractPlayer extends Sprite implements IPlayer 
   public function changeDirection():void 
   protected function walkToPosition():void 
   protected function pickUpItem():void 



class Player extends AbstractPlayer 
   override protected function walkToPosition():void 
   override protected function pickUpItem():void 

我知道 AS3 本身不支持抽象类。但我选择以这种形式使用它,因为它是有意义的。我不明白为什么接口只支持公共方法。这不会破坏拥有界面的全部目的吗?所以你知道玩家需要什么方法。只声明播放器类的公共函数似乎只完成了一半。

对这个概念进行详细的解释,或许还有一个更高级的解决方案来解释这个概念的结构将是非常有益的。

非常感谢, 肖恩

【问题讨论】:

【参考方案1】:

接口是方法声明的集合,允许不相关的对象相互通信。因此,实现方法的公共访问控制标识符。在典型的交互式上下文中,通常需要修改或控制问题对象的外部行为。在这种情况下,理想情况下,行为控制可以通过接口完成。不经意间,只有放入公共命名空间的方法才能从外部访问。请记住,不应直接修改对象的属性通过外部代码但仅通过接口是面向对象设计的良好实践。假设一个对象需要有多个访问控制点(行为控制);一个用于外部目的,另一个用于内部目的,然后将所有行为放在一个界面中会破坏目标。以下可能有助于实现目标(因为您说它的规模很大)。 p>

将行为放在您认为应该可以从外部访问的界面中。

定义Mediator来封装view-code-mediation:-监听用户触发的事件,更新视图发送通知到应用的其他层。

为数据目的定义模型。

定义要在应用程序中调用的可执行命令。

看看你是否可以尽可能多地促进层之间的耦合。目标是编写尽可能少的代码,而不是本质上的样板。我建议你使用诸如 robotlegs 之类的框架 如果你的项目真的那么大。框架将负责依赖注入,并在此过程中减轻编写样板代码的负担。

我希望上述内容有所帮助。谢谢。

【讨论】:

【参考方案2】:

接口充当使用所述接口在类中实现所需成员的大纲。因此,接口方法永远不会被直接调用,并且只在实现它们的类中使用不需要访问修饰符。

现在您是正确的,AS3 不支持抽象类,但是有一种方法可以根据设计实现“抽象”类 AS3。所以这就是你的代码的样子:

public interface IPlayer

    function init():void;
    function changeDirection():void;
    function walkToPosition():void;
    function pickUpItem():void;


public class AbstractPlayer extends Sprite implements IPlayer

    public function AbstractPlayer() 
        init();
    

    protected function init():void 
        throw new IllegalOperationError( "Abstract method, must be overridden in subclass" );
    

    public function changeDirection():void 

    protected function walkToPosition():void 

    protected function pickUpItem():void 


public class Player extends AbstractPlayer

    public function Player() 
        super();
    

    override protected function init():void 
        //implementation
    

默认情况下具有方法实现的抽象类将要求子类覆盖这些方法(请参阅init() 并抛出错误)保持对父类方法和成员的严格使用。

这是 AS3 的基本抽象类设计。这也是工厂方法模式的开始,您可以在此处阅读更多内容:http://www.adobe.com/devnet/actionscript/articles/ora_as3_design_patterns.html

现在更可重用的设计可能是更概括你的类名,也许更像这样:

public interface IEntity

    function init():void;
    function changeDirection():void;
    function walkToPosition():void;

这是假设除了Player 类之外的更多游戏对象将使用IEntity 接口中的方法。

现在你的Player 类可以成为一个新的实体类型对象:

public class Entity extends Sprite implements IEntity

    public function Entity() 
        init();
    

    protected function init():void 
        throw new IllegalOperationError( "Abstract method, must be overridden in subclass" );
    

    public function changeDirection():void 

    protected function walkToPosition():void 

    protected function pickUpItem():void 

现在关于设计,因为抽象类只是一个工具,就像任何其他工具一样,有许多不同的设计可以使用它,这真的取决于你的项目。我建议您筛选上述“工厂方法”模式和其他一些设计的链接,看看有什么适合您的需求。

【讨论】:

非常感谢您的洞察力。我知道工厂模式是众所周知的游戏实现。将进一步调查。再次感谢!【参考方案3】:

接口定义了其他类与该接口的特定实现交互的方式。其他类不能直接调用实现的私有方法——不需要接口来定义它们。

假设我们有两个AbstractPlayer 的子类:PlayerAIPlayerPlayer 类可能包含侦听特定输入事件并相应响应它们的方法,例如 onKeyUponMouseClick,它们应该是私有的:不需要外部类来知道如何控制播放器。另一方面,AIPlayer 由您在代码中定义的一些策略控制,因此它应该跟踪Player 的操作并做出相应的反应,而不是听用户的输入。这个类不需要onKeyUponMouseClick方法,为什么要把它们放在接口中呢?

【讨论】:

以上是关于Actionscript 3 中的接口和游戏架构的主要内容,如果未能解决你的问题,请参考以下文章

TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

Actionscript游戏/程序与他人联系[关闭]

手游项目的专属防御

无法识别数组中的 Actionscript 3 子项

TYPESDK手游聚合SDK客户端设计思路与架构之二:安卓平台统一化接口结构及思路

我应该学习 Actionscript 3 和 Javascript 来制作网页游戏吗? [关闭]