hi manuel,
du kannst erst auf stage zugreifen, wenn deine swf auf der bühne ist. daher schlägt dein aufruf im constructor fehl (ich geh davon aus, dass dies das problem ist). daher musst du deine listener und anderes, was die stage betrifft später ausführen, als sonst.
ein beispiel:
Preloader.as
PHP-Code:
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequest;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
public class Preloader extends Sprite {
private var url:String = "ToLoad.swf";
var loader:Loader = new Loader();
public function Preloader() {
configureListeners(loader.contentLoaderInfo);
loader.addEventListener(MouseEvent.CLICK, clickHandler);
var request:URLRequest = new URLRequest(url);
loader.load(request);
addChild(loader);
/*
//schlägt fehl, da es noch keinen content gibt
var mc:MovieClip = loader.content as MovieClip;
mc.init();
*/
}
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(Event.COMPLETE, completeHandler);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
dispatcher.addEventListener(Event.INIT, initHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
dispatcher.addEventListener(Event.OPEN, openHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
dispatcher.addEventListener(Event.UNLOAD, unLoadHandler);
}
private function completeHandler(event:Event):void {
trace("completeHandler: " + event);
var l:LoaderInfo = event.currentTarget as LoaderInfo;
var mc:MovieClip = l.content as MovieClip;
mc.init();//gibt die stage zurück
}
private function httpStatusHandler(event:HTTPStatusEvent):void {
trace("httpStatusHandler: " + event);
}
private function initHandler(event:Event):void {
trace("initHandler: " + event);
var l:LoaderInfo = event.currentTarget as LoaderInfo;
var mc:MovieClip = l.content as MovieClip;
mc.init();//gibt die stage zurück
}
private function ioErrorHandler(event:IOErrorEvent):void {
trace("ioErrorHandler: " + event);
}
private function openHandler(event:Event):void {
trace("openHandler: " + event);
}
private function progressHandler(event:ProgressEvent):void {
trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}
private function unLoadHandler(event:Event):void {
trace("unLoadHandler: " + event);
}
private function clickHandler(event:MouseEvent):void {
trace("clickHandler: " + event);
var loader:Loader = Loader(event.target);
loader.unload();
}
}
}
ToLoad.as
PHP-Code:
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class ToLoad extends MovieClip
{
public function ToLoad():void
{
// constructor code
trace(">>consturctor Stage:", stage);//null
addEventListener(Event.INIT, initHandler);//kommt nie zum tragen, da das event nur von LoaderInfo genutzt wird!!
addEventListener(Event.ADDED, addedHandler);
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
private function initHandler(e:Event):void{
trace(">>initHandler Stage", stage);//wird so nie ausgelöst
}
private function addedHandler(e:Event):void{
trace(">>addedHandler Stage:", stage);// kommt zweimal
//erstes mal, wenn es dem loader zugefügt wird -> stage = null;
//zweites mal, als child von loader gleich hinterher: stage wird zurückgegeben, wenn loader bereits auf der bühne ist
}
private function addedToStageHandler(e:Event):void{
trace(">>addedToStageHandler Stage:", stage);//gibt die stage zurück
}
public function init():void
{
trace(">>init Stage:", stage);//gibt die stage zurück, wenn schon auf der bühne vorhanden
}
}
}
swf direkt
Zitat:
>>consturctor Stage: [object Stage]
>>addedHandler Stage: [object Stage]
>>addedToStageHandler Stage: [object Stage]
|
swf im preloader
Zitat:
openHandler: [Event type="open" bubbles=false cancelable=false eventPhase=2]
progressHandler: bytesLoaded=0 bytesTotal=977
progressHandler: bytesLoaded=977 bytesTotal=977
>>consturctor Stage: null
>>addedHandler Stage: null
>>addedHandler Stage: [object Stage]
>>addedToStageHandler Stage: [object Stage]
initHandler: [Event type="init" bubbles=false cancelable=false eventPhase=2]
>>init Stage: [object Stage]
httpStatusHandler: [HTTPStatusEvent type="httpStatus" bubbles=false cancelable=false eventPhase=2 status=0 responseURL=null]
completeHandler: [Event type="complete" bubbles=false cancelable=false eventPhase=2]
>>init Stage: [object Stage]
|
folglich gibt es etwa 2 1/2 mehr oder weniger sinnvolle möglichkeiten. ADDED_TO_STAGE ist aber mit sicherheit das event, mit dem du am wenigsten probleme haben sollest.
mfg
sx