阶段什么时候加载?

时间:2013-03-11 20:08:42

标签: actionscript-3 flash flash-cs5

我正在Adobe Flash Professional CS5中构建一个项目(使用ActionScript 3.0)。

在其中一个类中,我想根据场景的大小向场景中添加一些对象。

我在构造函数中使用以下代码:

stageWidthint = stage.stageWidth;
stageHeightint = stage.stageHeight;
startMenu.x = stageWidthint / 2;
startMenu.y = ((stageHeightint / 2) - 40);
instructionsMenu.x = stageWidthint / 2;
instructionsMenu.y = ((stageHeightint / 2) + 2);
highscoreMenu.x = stageWidthint / 2;
highscoreMenu.y = ((stageHeightint / 2) + 44);
quitMenu.x = stageWidthint / 2;
quitMenu.y = ((stageHeightint / 2) + 86);
this.addChild(startMenu);
this.addChild(instructionsMenu);
this.addChild(highscoreMenu);
this.addChild(quitMenu);

我在stage上获得了空引用。快速搜索后,我发现当时尚未加载stage。不过,我想把这些孩子加到课堂上。舞台何时加载?如何解决这个问题并在游戏开始时仍显示所有内容?

3 个答案:

答案 0 :(得分:1)

在构造函数中使用ADDED_TO_STAGE事件。

 public function ConstructorName():void 
 {
     addEventListener(Event.ADDED_TO_STAGE,onAddedToStage); 
 }

 private function onAddedToStage(e:Event):void 
 {   
      removeEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
      // add init code here
 }

答案 1 :(得分:1)

我不确定使用场景时的工作原理,但您可以尝试:

package  {
  import flash.display.*;
  import flash.events.*;


  public class Test extends MovieClip {


    public function Test() {
      if (stage) {
        init();
      } else {
        addEventListener(Event.ADDED_TO_STAGE, init);
      }
    }

    protected function init(event:Event = null):void {
      trace("init");
      if (event) { removeEventListener(Event.ADDED_TO_STAGE, init) };
      //your code here
    }
  }
}

答案 2 :(得分:1)

Stage对象不是全局可用的 扩展MovieClip的类将具有属性“stage”(小写)
在您的类的实例添加到舞台之前,“stage”属性为null 这就是我们收听ADD_TO_STAGE事件的原因。

有stage = null的解决方法,其中一个将作为构造函数IE中的参数传递到阶段:var xxx:MyClass = new MyClass(s​​tage); 也就是说,如果创建实例的类已经具有对stage的引用。

我想补充一点,在自定义类中访问阶段并不是一个好的OOP实践,因为类应该只关注自己。我建议的是覆盖宽度设定器/吸气剂。这是因为尺寸可以改变,例如横向到纵向旋转。