错误#1009 addChld()as3 with loop

时间:2017-03-19 16:58:38

标签: class loops actionscript-3 game-loop

当我尝试添加我的课时,它说 "无法访问空对象引用的属性或方法。 在Main()"的class_obj()错误#1009

我需要知道如何拥有一个带有游戏循环的课程 对于像碰撞和东西这样的测试,请帮助!

如果我没有eventlistener输入框架对象ir工作 但是我需要循环的监听器。

主要课程

package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class Main extends MovieClip
    {
        var mc:class_obj;

        public function Main()
        {
            //constructor
            mc = new class_obj();
            addChild(mc);
        }
    }
}

对象类

package  
{

    import flash.display.MovieClip;
    import flash.events.Event;

    public class class_obj extends MovieClip 
    {

        public function class_obj() 
        {
            // constructor code
            stage.addEventListener(Event.ENTER_FRAME, loop);
        }
        public function loop(e:Event)
        {
            trace("LOOPED CLASS");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果您对舞台对象有一些引用,为了避免循环中出现任何问题,我认为@Pawel在他说“#34;你需要先听一下”时是对的:

Event.ADDED_TO_STAGE

赞成Pawel!

每个班级名称应该以他所说的大写字母开头,当你不再需要它时,删除一个事件监听器是一个很好的做法。

所以你的课程应该是:

主要:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import ClassObj;

    public class Main extends MovieClip {

        var mc:ClassObj;

        public function Main() {
            this.addEventListener(Event.ADDED_TO_STAGE,addClip);
        }

        private function addClip(e:Event):void {
            trace("Class Main instance is added to : " + this.parent);
            mc = new ClassObj();
            addChild(mc);
            e.target.removeEventListener(Event.ADDED_TO_STAGE,addClip);
            trace(this + "hasEventListener(Event.ADDED_TO_STAGE) = " + e.target.hasEventListener(Event.ADDED_TO_STAGE));
        }
    }

}

和ClassObj:

package {
    import flash.display.MovieClip;
    import flash.events.Event;

    public class ClassObj extends MovieClip {

        public function ClassObj() {
            this.addEventListener(Event.ADDED_TO_STAGE,checkClip);
        }

        private function checkClip(e:Event):void{
            trace("ClassObj instance is added to : " + this.parent);
            this.addEventListener(Event.ENTER_FRAME, loop);
            e.target.removeEventListener(Event.ADDED_TO_STAGE,checkClip);
            trace(this + "hasEventListener(Event.ADDED_TO_STAGE) = " + e.target.hasEventListener(Event.ADDED_TO_STAGE));
        }

        private function loop(e:Event):void{
             trace("LOOPED CLASS Stage is : " + e.target.stage);
             trace("LOOPED CLASS parent is : " + e.target.parent);
        }
    }

}

输出将是:

Class Main instance is added to : [object Stage]
ClassObj instance is added to : [object Main]
[object ClassObj]hasEventListener(Event.ADDED_TO_STAGE) = false
[object Main]hasEventListener(Event.ADDED_TO_STAGE) = false
LOOPED CLASS Stage is : [object Stage]
LOOPED CLASS parent is : [object Main]
LOOPED CLASS Stage is : [object Stage]
LOOPED CLASS parent is : [object Main]

...

[编辑]以下是了解ADDED和ADDED_TO_STAGE的有用链接:

http://fromzerotoas3hero.blogspot.be/2011/03/added-vs-addedtostage.html

[/编辑]

答案 1 :(得分:1)

您可能无法访问舞台(这只是您使用的对象,因此其他任何内容都无法显示为空。

你需要先听取

Event.ADDED_TO_STAGE

因为movieclip在添加到显示列表之前无法访问舞台。

修改

在您的简单情况下,您不需要使用使用阶段对象。您可以在class_object实例本身上侦听frame事件:

this.addEventListener(Event.ENTER_FRAME, loop);