我正在尝试在主菜单中没有任何内容的情况下启动as3.0项目,我希望我的默认actionscript类能够启动它。就像C中的main一样,AS3.0中有一个类似于main的函数吗?
答案 0 :(得分:3)
Document类最接近您想要的。 Document class info。我倾向于将文档类保持在最低限度。
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class Document extends MovieClip
{
public var _main:Main;
public function Document()
{
addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
}
//all initialization goes in here!
private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
initMain();
}
private function initMain():void
{
_main = new Main();
}
}
}
请注意,调用另一个Main类只是个人偏好。如果您尝试在舞台上引用项目,事件监听器也非常重要。
答案 1 :(得分:2)
我对上面的答案做了一些修改,可能会有用。
只有当SWF可能作为模块加载到另一个应用程序中时,侦听器才能在舞台上引用事物。如果保证此文档类是根文档类,则添加事件基本上是没有意义的。我已经修改了上面的答案,如果它是根SWF,它采取更快的路线,而没有制动模块化的可能性。
我建议调查RobotLegs之类的框架来组织你的代码。进入更具交互性的场景的大多数人认为他们不需要他们开始,并最终意识到他们存在的原因非常充分 - 即依赖性在这一系列工作中往往会变得混乱。如果您选择RobotLegs,那么您的“Main”类将是框架Context。
无论如何,为了有用,您的Main类需要访问显示列表,因此您需要传入对Document类的引用。尽管如此,将它传递给DisplayObjecContainer,以避免依赖于Main中的Document。
你也不需要扩展MovieClip,因为这里没有时间线; Sprite也可以提供服务,而且课程将更轻松。暴露主变量也没有充分的理由 - 如果您要模块化地使用SWF并在文档类中公开API,那么您不希望公开Main类,您希望公开接口。 (不幸的是,您无法将Document作为模块化SWF进行有用的接口加载 - 或者至少对Flash Player 9无法加载 - 因为存在与此过程相关的错误:blog post on problems interfacing a SWF
通过这些修改,上面的答案变为:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Document extends Sprite
{
private var main:Main;
public function Document()
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true);
}
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
init();
}
private function init():void
{
main = new Main(this);
}
}
}
但是你的主类不会知道Document类型,所以:
package
{
import flash.display.DisplayObjectContainer;
public class Main
{
private var viewComponent:DisplayObjectContainer;
public function Main(viewComponent:DisplayObjectContainer)
{
this.viewComponent = viewComponent;
...
}
}
}