【问题标题】:AS3 Accessing stage objects from a classAS3 从类中访问舞台对象
【发布时间】:2014-02-15 11:17:19
【问题描述】:

我正在编写一个 Player 类,并且我正在开发冲突,但是 flash 给我这一行的错误:

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

            }
        }
 }

错误是:

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

如何访问墙?墙是舞台上的一个符号……我应该用另一种方式来发展它吗?请帮忙

【问题讨论】:

  • 如果你确定舞台上有一个名为wall的对象,试试stage["wall"]

标签: actionscript-3 object stage


【解决方案1】:

MovieClip 是动态对象,而 Sprite 或 Stage 不是。对于这些类,除非明确定义了属性,否则编译器会在您尝试引用该属性时报错。

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

如果您要动态创建对象,则必须自己创建属性(这对于 Sprite 这样的静态类是不可能的),或者通过 DisplayList 获取方法 getChildAt()getChildByName() 引用它们.

对于类,除非您扩展已经是 DisplayObject 的类,否则您将无法访问 stageroot。您必须手动传递对 MainTimeline 或 Stage 的引用(可能在实例化期间)。即使您确实扩展了DisplayObject,您也必须首先将该对象作为父对象;在那之前,属性是null

为了争论,我们假设Player 类扩展了Sprite,并且你已经将它作为父对象。您的代码将正确编写如下:

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

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

顺便说一句,你的例子中有一个额外的右括号。

【讨论】:

    【解决方案2】:

    是的,如果您未选中自动声明阶段实例,您将收到该错误。在 AS3 中声明所有内容而不依赖 GUI 是一种很好的做法。就算是

    Public var boringBackground:Sprite;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2010-11-17
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多