我正在建立一个系统来管理游戏中的过场动画。但是,我遇到了一个棘手的问题,我很难尝试向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!")
}
}
答案 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();
}
}