Einzelnen Beitrag anzeigen
Alt 02-09-2010, 16:05   #2 (permalink)
shin10
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.495
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.CLICKclickHandler);

            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.COMPLETEcompleteHandler);
            
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUShttpStatusHandler);
            
dispatcher.addEventListener(Event.INITinitHandler);
            
dispatcher.addEventListener(IOErrorEvent.IO_ERRORioErrorHandler);
            
dispatcher.addEventListener(Event.OPENopenHandler);
            
dispatcher.addEventListener(ProgressEvent.PROGRESSprogressHandler);
            
dispatcher.addEventListener(Event.UNLOADunLoadHandler);
        }

        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.INITinitHandler);//kommt nie zum tragen, da das event nur von LoaderInfo genutzt wird!!
            
addEventListener(Event.ADDEDaddedHandler);
            
addEventListener(Event.ADDED_TO_STAGEaddedToStageHandler);
        }
        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
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten