AS3从类中访问舞台对象

时间:2014-02-15 11:17:20

标签: actionscript-3 object stage

我正在写一个类播放器,我正在开发碰撞但是flash给了我一个错误:

function checkCollision(event:Event)
        {
            if (this.hitTestObject(stage.wall)) // THIS LINE!!!!!!!!
            {
                trace("HIT");
            }
            else
            {
                trace("MISS");

            }
        }
 }

错误是:

  

通过引用访问可能未定义的属性墙   static类型flash.display:Stage。

我如何进入墙壁?墙是舞台上的象征......我应该以另一种方式发展它吗?请帮忙

2 个答案:

答案 0 :(得分:1)

MovieClip是一个动态对象,而Sprite或Stage则不是。对于这些类,除非明确定义属性,否则编译器会在您尝试引用它时抱怨缺少该属性。

如果您使用Flash IDE进行编程,“自动声明舞台实例”将在舞台上创建使dot.notation路径成为可能的属性。

enter image description here

如果您是动态创建对象,则必须自己创建属性(对于Sprite等静态类是不可能的),或者通过DisplayList提取方法引用它们{{3 }或getChildAt()

对于课程,除非您扩展已经是getChildByName()的课程,否则您无权访问stageroot。您必须手动传递对MainTimeline或Stage的引用(可能在实例化期间)。即使您确实扩展了DisplayObject,您也必须先将对象置于舞台上;在此之前,属性为null

为了论证,让我们假设Player类正在扩展Sprite,并且你已将它作为舞台的父级。您的代码将正确编写如下:

function checkCollision(e:Event) {
    if (this.hitTestObject(this.root.getChildByName("wall"))) {
        trace("HIT");
    } else {
        trace("MISS");
    }
}

请注意,对“墙”的调用不在舞台上。那是因为只有一个舞台的孩子,那是MainTimeline(a.k.a。root)。

BTW,你的例子中有一个额外的支撑。

答案 1 :(得分:1)

是的,如果您已自动声明未选中阶段实例,则会收到该错误。在AS3中声明所有内容并且不依赖于GUI来执行此操作是一种很好的做法。即使它是

Public var boringBackground:Sprite;

它最终会在性能和编码方面得到回报。