-3

我正在 Adob​​e 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当时尚未加载。尽管如此,我还是想把这些孩子加入班级。舞台什么时候加载?我怎样才能解决这个问题并在游戏开始时仍然显示所有内容?

4

3 回答 3

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
 }
于 2013-03-11T20:24:51.327 回答
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
    }
  }
}
于 2013-03-11T20:26:24.300 回答
0

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

stage = null 有一些变通方法,其中之一是将 stage 作为参数传递到构造函数 IE 中: var xxx:MyClass = new MyClass(stage); 也就是说,如果创建实例的类已经引用了 stage。

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

于 2013-03-12T15:44:43.553 回答