AS3 - 为什么我不能在我的根类之外使用舞台?

RVa*_*ine 1 actionscript-3

我有以下两个类:

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
            var test:NewClass = new NewClass(); 
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

package  
{
    import flash.display.Sprite;

    public class NewClass extends Sprite
    {

        public function NewClass() 
        {
            trace(stage.width);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

TypeError:错误#1009:无法访问空对象引用的属性或方法.在NewClass()[C:\ Documents and Settings\Roma\poo\src\NewClass.as:10]在Main/init()[C:\ Documents and Settings\Roma\poo\src\Main.as:23]在Main()[C:\ Documents and Settings\Roma\poo\src\Main.as:15]

为什么???

bac*_*dos 8

是的,flash开发用户......:D

嗯,原因是:舞台只适用于显示列表上的对象 ......

修改你的类如下:

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class NewClass extends Sprite {
        public function NewClass():void {
                if (stage) init();
                else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        private function init(e:Event = null):void {       
                removeEventListener(Event.ADDED_TO_STAGE, init);
                trace(stage.width);//you may want to use stage.stageWidth actually
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和Main :: init如下:

    private function init(e:Event = null):void {       
            removeEventListener(Event.ADDED_TO_STAGE, init);
            var test:NewClass = new NewClass();     
            this.addChild(test);
    }
Run Code Online (Sandbox Code Playgroud)

哦,你可以改变你Coding Style TypeBraceAfterLineBraceOnLineTools > Program Settings > FlashDevelop > Indenting,以防万一你倾向于...;)


编辑: 如果你想访问舞台,在a的范围内DisplayObject,你需要确定,舞台是可用的...如果你想尽快访问舞台,那么你需要提供的技巧...但是如果您在点击处理程序中访问舞台,例如,这会自动暗示DisplayObject显示列表中的... ...无法单击它...

但是请注意:我不认为,从任何地方访问舞台都特别聪明......当涉及到显示时,你的应用层次结构应该遵循显示列表层次结构,即访问从根目录到分支,以及不是反过来......这对于实现可重用性很重要......


格尔茨

back2dos