我正在写一个类播放器,我正在开发碰撞但是flash给了我一个错误:
function checkCollision(event:Event)
{
if (this.hitTestObject(stage.wall)) // THIS LINE!!!!!!!!
{
trace("HIT");
}
else
{
trace("MISS");
}
}
}
错误是:
通过引用访问可能未定义的属性墙 static类型flash.display:Stage。
我如何进入墙壁?墙是舞台上的象征......我应该以另一种方式发展它吗?请帮忙
答案 0 :(得分:1)
MovieClip是一个动态对象,而Sprite或Stage则不是。对于这些类,除非明确定义属性,否则编译器会在您尝试引用它时抱怨缺少该属性。
如果您使用Flash IDE进行编程,“自动声明舞台实例”将在舞台上创建使dot.notation
路径成为可能的属性。
如果您是动态创建对象,则必须自己创建属性(对于Sprite
等静态类是不可能的),或者通过DisplayList
提取方法引用它们{{3 }或getChildAt()
。
对于课程,除非您扩展已经是getChildByName()
的课程,否则您无权访问stage
或root
。您必须手动传递对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;
它最终会在性能和编码方面得到回报。