我正在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
。不过,我想把这些孩子加到课堂上。舞台何时加载?如何解决这个问题并在游戏开始时仍显示所有内容?
答案 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(stage);
也就是说,如果创建实例的类已经具有对stage的引用。
我想补充一点,在自定义类中访问阶段并不是一个好的OOP实践,因为类应该只关注自己。我建议的是覆盖宽度设定器/吸气剂。这是因为尺寸可以改变,例如横向到纵向旋转。