正确使用Actionscript 3中的接口

时间:2011-11-03 20:17:12

标签: actionscript-3 interface

我已经在我的hero.as3类中创建了一个名为IHero的接口。 英雄类是写的,所以它可以在movieclip类中继承来处理运动等等。但不知怎的,我无法弄清楚如何用一个好的实践来编码。

也许我的方向错了。

我想要一个movieclip子类,例如,它将是一个英雄。

我是否应该使用以下方法在英雄级别中实施IHero,或者这是否过度杀伤? - 我想我正在寻找一个界面应该是什么以及什么不应该的答案。这是界面。

package com.interfaces
{
    public interface IHero
    {
        //movement
        function MoveLeft():void;
        function MoveRight():void;
        function MoveUp():void;
        function MoveDown():void;

        //in battle
        function DoDamage(isCasting:Boolean):void;
        function DoHeal():void;
        function Flee():void;
        function TakeDamage():void;
        function IsAlive():Boolean;
        function CheckDeath():void;
        function Die():void;
    }
}

3 个答案:

答案 0 :(得分:0)

通常,您需要一个扩展movieclip的常规类定义,然后将您的英雄动画片段设置为在actionscript选项的导出中使用该类。您的游戏很可能根本不需要界面。

答案 1 :(得分:0)

我认为你正在 正确的轨道上,无论正确的一个 错误的是否总是主观的。但如果你确实想走这条路,我建议你阅读Mick West的this article。它已经有几年了,但它仍然非常适用。

我认为你真的有两个不同的接口,但可能更多

public interface IMoveable {
    function moveLeft(obj:DisplayObject):void;
    function moveRight(obj:DisplayObject):void;
    function moveUp(obj:DisplayObject):void;
    function moveDown(obj:DisplayObject):void;
    function Flee(obj:DisplayObject);
}

public interface IFightable {
    function doDamage(withWeapon:IEquipableWeapon);
    function takeDamage(fromWeapon:IEquipableWeapon);
    function get isAlive():Boolean;
    function checkDeath():void;
    function Die():void;
    function doHeal();
    function get health():Number;
}

然后...

public class SimpleMover implements IMoveable {
    // The movement implementation

    // for example:

    public funciton moveLeft(obj:DisplayObject) {
        obj.x = obj.x -= 10;
    } 
}

public class SimpleFighter implements IFightable {
    // The fighting implementation

    private var _health:Number = 100;

    function doDamage(withWeapon:IEquipableWeapon) {
        _health -= withWeapon.damage;
    }
}

然后将这些内容注入MovieClip的子类Hero

public class Hero extends MovieClip {

    private var _mover:IMoveable;
    private var _fighter:IFightable;

    public function Hero(mover:IMoveable, fighter:IFightable) {
        _mover = move;
        _fighter = fighter;
    }

}

在这里,您使用Hero类作为Component Manager和Render组件,这与West在文章中讨论的内容略有不同,但我离题了。但是这个想法是你的经理(Hero)或多或少变成了一个协调者,代理回调所有组件适用的回调;调用_moverfighter上的方法来完成您的实际工作。

使用这样的方法有一些优点,还有一些缺点。首先,它的设置更复杂;它需要你真正喜欢组件以及代码的每个逻辑组块将要做什么。但另一方面,它将您的实现彼此分离,使其更易于测试和可重用。您也可以随时更换组件(编译时或运行时),这可以在创建新实体时提供一些灵活性。

但无论如何,它只是暗示你似乎在调情的略有不同的范例。也许你会从中获得一些好处。但如果你还没有,那绝对可以阅读这篇文章。

还要研究(比如检查API)Unity Engine,它具有类似的聚合与继承模型,其中接口是抽象的关键。

答案 2 :(得分:0)

只是澄清一下 - 接口是实现的,而不是继承的。因此,您创建的实现IHero的类的类型无关紧要。因此,要创建一种实现Ihero的库类,请扩展一个显示对象,如Sprite或MovieClip,然后使用implements关键字指示该类实现Ihero。

添加Ihero方法,您现在拥有一个实现iHero的显示对象类。它可能看起来像这样(注意没有提供构造函数)

package 
{
    import flash.display.Sprite;
    import com.interfaces.IHero;

    /**
     * ...
     * @author Zachary Foley
     */
    public class MyDisplayObkect extends Sprite implements IHero  
    {

        public function MoveLeft():void
        {
            // Add Implementation here;
        }

        public function MoveRight():void
        {
            // Add Implementation here;
        }

        public function MoveUp():void
        {
            // Add Implementation here;
        }

        public function MoveDown():void
        {
            // Add Implementation here;
        }

        //in battle
        public function DoDamage(isCasting:Boolean):void
        {
            // Add Implementation here;
        }

        public function DoHeal():void
        {
            // Add Implementation here;
        }

        public function Flee():void
        {
            // Add Implementation here;
        }

        public function TakeDamage():void
        {
            // Add Implementation here;
        }
        public function IsAlive():Boolean
        {
            // Add Implementation here;
        }

        public function CheckDeath():void
        {
            // Add Implementation here;
        }

        public function Die():void
        {
            // Add Implementation here;
        }

    }

}