【问题标题】:error #1009 addChld() as3 with loop错误 #1009 addChld() as3 带循环
【发布时间】:2017-03-19 16:58:38
【问题描述】:

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

我需要知道如何创建一个有游戏循环的类 测试碰撞之类的东西,请帮忙!

如果我没有事件监听器在我的工作对象上输入框架 但我需要循环的监听器。

主类

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");
        }
    }
}

【问题讨论】:

  • 另请注意,在 AS3 中,我们使用 PascalCase 作为类名 - ClassObj 优于 class_obj,因此很容易区分我们处理的属性类型。

标签: class loops actionscript-3 game-loop


【解决方案1】:

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

Event.ADDED_TO_STAGE

为帕维尔投票!

正如他所说,每个类名称都应以大写字母开头,当您不再需要事件侦听器时,最好将其删除。

所以你的课程应该是:

主要:

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]

...

[EDIT] 这是了解 ADDED 和 ADDED_TO_STAGE 的有用链接:

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

[/编辑]

【讨论】:

  • 您是否考虑将其放入文档中?没有ADDED_TO_STAGE 例子
  • 现在在 Adob​​e 网站上禁用了 cmets。 @Pawel 但是你可能会在网上找到很多关于 ADDED 和 ADDED_TO_STAGE 的文档
  • 我在考虑 SO 文档。
  • @Paweł 这是一个简短的示例(简短而有效地理解这两个事件)。 fromzerotoas3hero.blogspot.be/2011/03/…
  • @Nautis 正如 Pawel 所说:“如果它解决了您的问题,您应该接受一个问题(点击绿鸟)”。这可以避免浪费其他成员的时间。在答案之间进行选择并将其标记为已解决,或者如果这不能解决您的问题,请尝试更准确!谢谢。
【解决方案2】:

您可能无权访问舞台(这只是您使用的对象,因此显然没有其他对象可以为空。

你需要先听

Event.ADDED_TO_STAGE

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

编辑

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

this.addEventListener(Event.ENTER_FRAME, loop);

【讨论】:

  • 谢谢!!!我已经想弄清楚很长时间了。现在你说这似乎很明显
  • 如果它解决了您的问题,您应该接受一个问题(单击绿色小鸟),以便其他人可以看到它已解决并享受绿色数字的增加;)
  • @Indy 仅供参考,如果建议编辑删除文档链接,请尽可能修复帖子的其他方面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多