引用Actionscript 3中子类定义的函数

时间:2014-09-09 17:47:55

标签: actionscript-3 function flash oop subclass

我正在建立一个系统来管理游戏中的过场动画。但是,我遇到了一个棘手的问题,我很难尝试向Google描述它。我需要访问Flash告诉我的一个函数" undefined"。

这就是我所拥有的;

Cutscene是一个基类,包含所有过场动画的基本功能

Cutscene1扩展Cutscene,并包含有关个别过场动画的信息。这些信息包括功能和变量。稍后会Cutscene2, Cutscene3,所有这些都会延伸Cutscene

CutsceneHandler获取Cutscene,确定Cutscene的下一步,并告诉Cutscene执行该步骤定义的功能。

CutsceneHandler只接受Cutscene

所以我们给这个处理程序一个新实例化的Cutscene1。汉德勒说"嘿,它是Cutscene,一切都很酷。"。但是现在,处理程序告诉Cutscene执行仅在其子类中定义的函数。汉德勒说"哇,Cutscene班没有这样的功能!"并抛出一个错误。调用可能未定义的函数。

我们怎样才能解决这个问题?我们如何称呼这个功能是一个问题吗?我在下面提供了一些简化代码。

public class CutsceneHandler extends Sprite {

    var activeCutscene:Cutscene

    public function CutsceneHandler() {
        //empty constructor
    }

    public function beginCutscene(cutscene:Cutscene) {
        activeCutscene = cutscene
        executeStep(activeCutscene.steps[0])
    }

    public function executeStep(step:Object) {
        if (step.action) {
            activeCutscene.action()
        }

    }

}

__

public class Cutscene1 extends Cutscene {

    public var steps = [
              {action:someFunction,someImportantDetail:true},
              {action:someOtherFunction,someImportantDetail:false}
              ]

    public function Cutscene1() {
        //empty constructor
    }

    public function someFunction() {
        trace ("hello!")
    }
    public function someOtherFunction() {
        trace ("goodbye!")
    }

}

1 个答案:

答案 0 :(得分:3)

这听起来像是command pattern的工作!

简单来说,我们的想法是将每个步骤的细节封装在单独的类实例中,这些实例都使用单个execute方法实现接口。您的处理程序类可以通过该接口调用这些步骤,而无需了解步骤所属的Cutscene的特定子类。

以下内容应该让您朝着正确的方向前进。

ICommand界面:

public interface ICommand {
    function execute():void
}

具体命令:

public class HelloCommand implements ICommand {

    public function execute():void {
        trace("hello");
    }
}

public class GoodbyCommand implements ICommand {

    public function execute():void {
        trace("goodbye");
    }
}

Cutscene的子类

public class Cutscene1 extends Cutscene {

    // Declare steps variable in the base class since 
    // all subclasses will use it

    public function Cutscene1() {
        // Define the steps specific to this subclass
        steps = [
            new HelloCommand(),
            new GoodbyeCommand()
        ];
    }
}

处理程序类

// Only extend Sprite if the class needs to be displayed
public class CutsceneHandler {

    var activeCutscene:Cutscene

    public function CutsceneHandler() {
        //empty constructor
    }

    public function beginCutscene(cutscene:Cutscene) {
        activeCutscene = cutscene;
        // Cast the step as ICommand and execute it
        (activeCutscene.steps[0] as ICommand).execute();
    }
}