我想保持完全控制权从主影片剪辑我的比赛和其他地方。 但我不希望通过构造函数传递它的实例也不做其子女的任何.parent参考啄。 似乎过于workaroundish和不稳定。
样本情况:
public class Main extends MovieClip {
public function Main() {
addChild(new MainMenu());
}
public function startGame():void {
trace("Game started");
}
}
public class MainMenu extends Sprite {
public function MainMenu() {
var option:Option = new Option(); // Some BitmapData library linkage
option.addEventListener(MouseEvent.CLICK, clicked);
addChild(option);
}
public function destroy():void {
// set null/dispose/removeChildren/removeEventListener/etc.
}
private function clicked(evt:MouseEvent):void {
// Should trigger startGame() here (how?) to keep the flow at Main,
destroy(); // since this has nothing to do with it anymore
}
}
我想对于一些单身般的解决方案,但有一个在AS3没有静态类。 它似乎不好的做法,从我研究(是吗?)。
好吧,我只想尽一切从主视角与优雅的代码 ,或者至少官方的做法 。 我怎样才能做到这一点? (请告诉我这是可能的...:S)
我认为有2种方法,你可以想想:静态实例:
public static var main:Main;
public function Main() {
main = this;
...
}
然后:
public function MainMenu() {}
private function clicked(evt:MouseEvent):void {
Main.main.startGame();
}
或者使用一些静态调度员,如果您的应用程序不是太大:
public static var dsp:EventDispatcher = new EventDispatcher();
public function Main() {
dsp.addEventListener("StartGame",stageGame);
...
}
在MainMenu的:
private function clicked(evt:MouseEvent):void {
Main.dsp.dispatchEvent(new Event("StartGame"));
}
在这里,您可以随时创建其他类将处理事件分派/听。
对于单身我用格兰特斯金纳的Singleton类效果很好。
但是,对于您的需求,我不认为辛格尔顿是解决方案。 相反,我会子对象调度的父对象将监听自定义事件。 下面是一个简单的例子,使用优秀AS3信号库,而不是自定义事件:
public class Main extends MovieClip {
public function Main() {
var mainMenu:MainMenu new MainMenu();
addChild(mainMenu);
mainMenu.destroyed.add(startGame);
}
public function startGame():void {
trace("Game started");
}
}
和子:
public class MainMenu extends Sprite {
public var destroyed:Signal;
public function MainMenu() {
destroyed= new Signal();
var option:Option = new Option(); // Some BitmapData library linkage
option.addEventListener(MouseEvent.CLICK, clicked);
addChild(option);
}
public function destroy():void {
// set null/dispose/removeChildren/removeEventListener/etc.
}
private function clicked(evt:MouseEvent):void {
// Tell any class that is listening that this is being destroyed
destroyed.dispatch();
destroy();
}
}
这样,MainMenu的类并不需要知道什么主; 相反,它只是分派时恰当的指导听班采取行动的信号。
可能有处理这更优雅的方式(我很好奇,我自己什么样的方法等人都有这个问题),但是这是一个我一般都用,我觉得它工作得很好。
文章来源: How can I trigger a function at Main from an instanced object — the right way?