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

时间:2009-08-22 15:19:20

标签: 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(); 
        }

    }

}

package  
{
    import flash.display.Sprite;

    public class NewClass extends Sprite
    {

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

    }

}

我收到以下错误:

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]

为什么???

2 个答案:

答案 0 :(得分: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
        }
    }
}

和Main :: init如下:

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

哦,您可以在Coding Style Type中将BraceAfterLineBraceOnLine更改为Tools > Program Settings > FlashDevelop > Indenting,以防您有意......;)


修改 如果你想访问舞台,在DisplayObject的范围内,你需要确定,舞台是可用的...如果你想尽快访问舞台,那么你需要提供的技巧...但是如果你在点击处理程序中访问舞台,例如,这自动意味着DisplayObject在显示列表中......否则无法点击...

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


格尔茨

back2dos

答案 1 :(得分:0)

正如back2dos所说,只有显示列表中的元素才有对该阶段的有效引用。由于NewClass的实例仅仅是init实例的Main方法中的临时变量,您还没有addChild将其放在显示列表中的值它的stage属性为null。注意:只有在显示列表中的父母的子女才能获得对舞台的有效参考。

如果您需要对类中不会添加到显示列表中的舞台的引用,则需要将舞台传递给该类的实例。与AS2不同,该阶段没有全局可访问的引用(即_root_level0已弃用)