After learning of this excellent method of accessing an object placed on the stage in Flash CS5 in a class other than the document class (found in this thread), I have run into
The problem that you're having is that you are instantiating your controller class before you have a stage object to pass to it. You must wait until after the ADDED_TO_STAGE
event is fired to instantiate everything else:
public class Game extends MovieClip {
private var _player:Player;
private var _controller:Controller;
public function Game():void
{
addEventListener(Event.ADDED_TO_STAGE, added);
}
private function added(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, added);
_player = new Player(stage);
_controller = new Controller(_player,stage);
addChild(_player);
}
}
There is a better way
You do not need to pass stage though to your player and controller. If you just pass a reference to this
, you will pass a reference to the document class. This is a better practice to get into as it prepares you for more advanced programming approaches like design patterns.
So you would have your document class:
public class Game extends MovieClip {
private var _player:Player;
private var _controller:Controller;
public function Game():void
{
addEventListener(Event.ADDED_TO_STAGE, added);
}
private function added(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, added);
_player = new Player(this);
_controller = new Controller(_player,this);
addChild(_player);
}
}
and in your player class:
public class Player extends MovieClip {
private var docRef:Game;
private var _lights:uint;
public function Player($docRef:Game):void {
this.docRef = $docRef;
docRef.greenLight1.visible=false; //no longer needs to wait for player to be on the stage
}
}
The advantage is obvious, since you know that you document class is on the stage, Player does not need to be on the stage before it can interact with it. It does not need ever be on the stage. If you need stage, say for adding listeners like you do in the Controller, you can use the documents stage property:
docRef.stage.addEventListener ...