在ActionScript中,“if(stage)init();”的意思是什么?

5
我正在使用FlashDevelop创建我的第一个AS3程序,但我不理解构造函数中的指令含义:
package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
        }

    }

}

if (stage) init(); 这句话是什么意思?Event.ADDED_TO_STAGE 是什么?为什么要在 init() 中移除监听器?


1
我很惊讶这里还没有答案,所以在你等待的时候:如果你搜索“Event.ADDED_TO_STAGE”,你会得到一些有趣的阅读材料,我猜这会回答你的问题。(我不确定,因为我不从事ActionScript;这就是为什么这不是一个答案。但是链接看起来非常准确。)对我来说,总体效果是确保只有当你的组件在“stage”上时才调用init:如果你已经在“stage”上,立即调用它。如果你不在,“hook up”一个监听器,监听当你被放置在“stage”上时触发的事件(然后在调用时删除它)。 - T.J. Crowder
只有一个答案,但是非常好 :) - user310291
1个回答

9

主类通常是文档类 -> 作为第一个放置到舞台(显示树的根)的类。这意味着在构造函数(Main函数)中,您已经可以访问舞台。

if(stage) init();

实际上,如果stage != null,则运行初始化。

为什么在文档类中测试null?
如果您的swf被包装到另一个swf中,则您的主函数尚未访问stage,因为只有显示列表(在stage上)上的精灵(电影剪辑等)才能访问stage。
像这样:

var mc:MovieClip = new MovieClip();//mc.stage == null
stage.addChild(mc);//mc.stage != null

通过将监听器添加到ADDED_TO_STAGE,您等待直到实际访问舞台,然后初始化它。您立即删除侦听器,因为您不再需要它。
这是文档(主)类中的常见情况,因为您需要舞台将菜单、介绍或其他内容添加到舞台上,以便其可见。

值得指出的是,这通常是不必要的。如果所讨论的类需要创建一个根级别的键事件监听器,那么它将需要一个舞台引用。但是,如果您的类实际上并不需要舞台引用来完成任何操作,那么没有特殊的理由使用这种代码(除了作为一种懒惰初始化的方式)。 - fenomas
@fenomas 是的,但根据我的经验,我从未见过不需要引用stage的主类。你总是需要向stage添加一些东西,因为没有其他方法可以显示内容。 - Antriel
1
@Antriel:通常一个类应该将其显示组件添加到自身中,这样它就可以在其他上下文中重复使用。如果您直接将子项添加到舞台,则使用了一种事实上的全局变量。 - fenomas
非常感谢,这真的是一个很棒的答案,特别是因为我在谷歌上搜索时找不到这样清晰的解释。 - user310291
这个问题真是救命稻草!即使有了你(Antriel)的回答,我仍然不完全确定为什么要使用它。有没有办法找出是否需要使用它?例如,在我访问stage之前初始化我的内容会出现任何错误吗?或者如果在我访问stage之前初始化我的内容会发生什么其他事情?Fenomas,通过将显示组件添加到类本身,您的意思是:addChild();?在addChild()之前没有stage引用? - Rihards
通常情况下您不需要使用它,因为Main类始终可以访问stage。如果没有访问权限,stage将为空,因此在使用时会导致运行时异常。但是如果您不在init函数中使用stage,则不会出现任何错误。(我们通常在Main类构造函数中使用stage来设置scaleMode或其他内容,这就是为什么FlashDevelop会自动创建这个模板的原因) - Antriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接