我建议保留静态实例(单例),并基于事件工作。现在您将所有功能公开,这是不可取的。使用自定义事件并不难。看看这就是你的Main类的样子:
public class Main extends MovieClip
{
public function Main()
{
this.addEventListener(Event.ADDED_TO_STAGE, handleAddedToStage);
}
public function handleAddedToStage(event:Event)
{
this.removeEventListener(Event.ADDED_TO_STAGE, handleAddedToStage);
this.showWelcomeScreen();
stage.addEventListener(ScreenEvent.SHOW_WELCOME_SCREEN, handleScreenEvent);
stage.addEventListener(ScreenEvent.SHOW_LEVEL, handleScreenEvent);
}
private function handleScreenEvent(event:ScreenEvent):void
{
switch (event.type)
{
case ScreenEvent.SHOW_WELCOME_SCREEN:
{
this.showWelcomeScreen()
break;
}
case ScreenEvent.SHOW_LEVEL:
{
// event.data contains level number
this.startLevel(event.data);
break;
}
default:
{
trace("Main.handleScreenEvent :: Cannot find event.type '" + event.type + "'.");
break;
}
}
}
private function showWelcomeScreen():void
{
trace("show WelcomeScreen")
//some private code in here
}
private function startLevel(level:int):void
{
trace("start level: " + level)
//some other private code here
}
}
这就是自定义事件类的外观(ScreenEvent.as)。请注意,它有一个名为data的可选参数。您可以将任何值(对象、数字、字符串等)传递给它。为了使示例尽可能清晰,我对两个动作都使用了一个事件类,您还可以选择为具有更详细参数的其他动作制作更具体的自定义事件,您可以使用ScreenEvent、LevelEvent、PlayerEvent、GameEvent等名称..
在类的顶部定义了(静态常量)类型。一个事件应该只有吸气剂。
package
{
import flash.events.Event;
public class ScreenEvent extends Event
{
public static const SHOW_WELCOME_SCREEN:String = "ScreenEvent.showWelcomeScreen";
// event.data contains level number
public static const SHOW_LEVEL:String = "ScreenEvent.showLevel";
private var _data:String;
public function ScreenEvent(type:String, data:String):void
{
super(type);
this._data = data;
}
public function get data():String
{
return this._data;
}
override public function clone():Event
{
return new ScreenEvent(this.type, this._data);
}
}
}
.. 在您的代码中的任何地方,您都可以将事件发送到舞台。
// dispatch event to Main (stage). Should show welcome screen in our case
stage.dispatchEvent(new ScreenEvent(ScreenEvent.SHOW_WELCOME_SCREEN));
// show level 2
stage.dispatchEvent(new ScreenEvent(ScreenEvent.SHOW_LEVEL, 2));
我知道,它的代码有点多,一开始看起来更困难,但如果项目发展壮大,它将有很大帮助。与事件的区别是“这可能发生,当它发生时,做这个”而不是“在这里做这个,在那里做那个”的优点是,如果你在 Main 类中删除事件监听器,什么都不会中断(松散地耦合)。这使得维护更容易,它节省了一个单例,如果你愿意,你可以扩展 Main 类。