为什么我的Actionscript 3类中的stage未定义,即使我已经导入了Stage类?

时间:2010-01-12 05:47:51

标签: actionscript-3 stage

 package    {

 import flash.display.Stage;

 public class MyGlobal {

  public static  var CX:Number = stage.stageWidth / 2;
  public static  var CY:Number = stage.stageHeight / 2;  

 }

}

错误是"1120: Access of undefined property stage."为什么?

4 个答案:

答案 0 :(得分:9)

如上所述,stage是从DisplayObject继承的类的属性。在将类添加到舞台之前,通常通过DisplayObjectContainer的addChild方法将舞台暂停。

答案 1 :(得分:3)

舞台属性仅可用于显示已添加到舞台的对象。您的类不从DisplayObject继承,因此您的类不存在stage属性。即使您的类继承自DisplayObject,也需要通过父显示对象的addChild()将其添加到舞台中。

如果您的类不是显示对象,但需要测量的阶段对象或其他属性,请将其作为参数发送给构造函数。

否则,让你的类继承DisplayObject,然后你必须为对象添加到舞台时添加一个事件监听器:

addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

在onAddedToStage()方法中,舞台现在可用(编辑:只要最顶层的父容器已添加到舞台中,舞台属性将可用。)

答案 2 :(得分:1)

我通过将阶段Object引用传递给类的构造函数来解决这个问题。老实说,我不喜欢这个解决方案,因为你必须通过舞台,但这是我看到的最简单的方式。

这是我在构造函数中所做的:

public function Ball(b:Object,stageRef:Object)
{
    ballObject = b;
    speed = 10;
    stageRef.addEventListener(KeyboardEvent.KEY_DOWN,function(e:KeyboardEvent):void{
        currentKeyCode = e.keyCode; 
    });
    stageRef.addEventListener(KeyboardEvent.KEY_UP,function(e:KeyboardEvent):void{
        currentKeyCode = 0;   
    });
}

答案 3 :(得分:0)

Sam的回答实际上是对的。最简单的解释是stage是一个实例而不是类成员。

如果您的字段未声明为静态,则可以访问阶段。但是你可能会得到一个空引用错误;)