Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-03-2009, 18:37   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2002
Ort: Mainz
Beiträge: 18
Question Wie ändert man eineEigenschaft eines MCs, der auf der Bühne eines externen SWFs liegt

Ich bekomme es trotz intensiver Forumslektüre (und Suche) nicht hin - und mein nun mein Problem mal in eine einfachen Testdatei extrahiert. Es würde mich freuen, wenn mir jemand helfen könnte

Ich habe eine Hauptanwendung (testmain), die externe SWF-Dateien (testimport) einliest. In diesem externen File liegt ein MC (apparel_mc) auf der Bühne - der seinerseits wiederum aus MCs (u.a. panel_mc) besteht. Alle sind vom Typ MovieClip und haben einen Namen im Eigenschaftsfenster. Nun möchte ich aus der Hauptanwendung heraus in dem geladenen Clip gerne die Eigenschaft eines dieser Unterclips ändern (hier testweise Alpha ... später Farbänderung)

Code in testmain
PHP-Code:
// erzeugt eine Instanz eines Ladeobjekts
var apparel:MovieClip = new ApparelLoader("testimport.swf") as MovieClip;
addChild(apparel);  

apparel.alpha 0.5 // geht - will ich aber nicht
// apparel.apparel_mc.panel_mc.alpha = 0.5 // geht nicht
// apparel.getChildByName("apparel_mc").panel_mc.alpha = 0.5 //geht nicht 
Code in Loader-Klasse (ApparelLoader.as)
HTML-Code:
package {
	import flash.display.*;
	import flash.net.URLRequest;
	import flash.events.*;


	public class ApparelLoader extends MovieClip {
		public var loader:Loader;
		public var container:Sprite;


		public function ApparelLoader(swfURL:String) {
			container = new Sprite();
			addChild(container);

			loader = new Loader();
			var swfURLReq:URLRequest = new URLRequest(swfURL);

			loader.contentLoaderInfo.addEventListener(Event.COMPLETE,geladen);
			// externes File nachladen
			loader.load( swfURLReq );
		}
		
		private function geladen(e:Event):void {
			container.addChild(loader);
		}
	}
}
Alle Files zum Angucken
k-eye ist offline   Mit Zitat antworten
Alt 07-03-2009, 20:34   #2 (permalink)
agedoubleju
Gast
 
Beiträge: n/a
Zitat:
apparel.alpha = 0.5 // geht - will ich aber nicht
Versuch mal, nach dem Complete auf den Loader zuzugreifen, bspw. :
PHP-Code:
//in testmain
public var apparel:MovieClip = new ApparelLoader("testimport.swf") as MovieClip;
addChild(apparel);  
apparel.addEventListener("completed",completedHandler);

private function 
completedHandler(event:Event):void{
   
apparel.alpha 0.5;
}

//in ApparelLoader.as
private function geladen(e:Event):void {
   
container.addChild(loader);
   
dispatchEvent(new Event("completed"));

  Mit Zitat antworten
Alt 09-03-2009, 13:27   #3 (permalink)
as3 addict
 
Benutzerbild von Marcy_LH
 
Registriert seit: Jun 2002
Ort: Leipzig
Beiträge: 351
PHP-Code:
package {
    
import flash.display.*;

    public class 
TestMain extends MovieClip {
        
        private var 
loader Loader null;
        
        public function 
TestMain() {
            var 
request URLRequest = new URLRequest("testimport.swf");
            
loader = new Loader();
            
loader.addEventListener(Event.COMPLETEonComplete);
            
loader.load(request);
        }
        
        private function 
onComplete(event Event) : void {
            
//Wenn die geladene SWF eine Dokumentenklasse hat
            //hier statt 'as MovieClip' -> 'as TestImport',
            //dann hast du den mc gleich typisiert vorliegen
            //und kannst auf die Instanzvariablen zugreifen.
            //
            //var testImport : TestImport = loader.content as TestImport; 
            //addChild(testImport);
            
var mc MovieClip loader.content as MovieClip
            
addChild(mc);
        }
    }

In dem Beispiel brauchst du deine Loaderklasse nicht wirklich... oder dann zumindest den container, weil dein ApparelLoader schon ein MovieClip ist.
Marcy_LH ist offline   Mit Zitat antworten
Alt 12-03-2009, 15:58   #4 (permalink)
Neuer User
 
Registriert seit: Jul 2002
Ort: Mainz
Beiträge: 18
Lightbulb Lösung gefunden

Ich schreibe hier mal meine Lösung hin, damit es vielleicht anderen hilft, die das gleiche Problem haben. Ich hoffe, ich erkläre das alles richtig...

Vielen Dank an Holger und an Marcy für die Unterstützung. Beide haben recht: Man braucht einen Eventlistner, weil man erst nach dem Laden auf das geladene Objekt vollständig zugreifen kann (wie Holger sagte) - und man braucht eigentliche keinen zusätzlichen Container, weil der Loader selbst ja den geladenen Clip enthält (wie Marcy sagte).

Trotzdem habe ich beim Zugriff auf das geladene Objekt immer wieder den Fehler "1119: Zugriff auf eine möglicherweise nicht definierte Eigenschaft über einen Verweis mit statischem Typ flash.display:DisplayObject" bekommen. Die Lösung habe ich bei "godfather" Colin Moock (...was würde man ohne seine Bücher machen?) gefunden.

Man muss den Typ des geladenen Objekts vom DisplayObjekt in die gewünschte Klasse "casten" (bei SWF zb. MovieClip, beim Bild besser Bitmap). Siehe Essential Actionscript, Seite 782 | Chapter 28: Loading External Display Assets.

PHP-Code:
package {

    
import flash.display.*;
    
import flash.net.URLRequest;
    
import flash.events.*

    public class 
LadeSWF extends Sprite {

        private var 
loader:Loader;

        public function 
LadeSWF() {
            
// erzeugt ein neues LadeObjekt
            
loader = new Loader( );
            
// definiert die URL für die entfernte SWF-Datei
            
var url:URLRequest = new URLRequest("testimport.swf");
            
// meldet das automatisch assozierte LoaderInfo-Objekt bei einem Listener an
            
loader.contentLoaderInfo.addEventListener(Event.INITgeladen);
            
// startet den Ladevorgang
            
loader.load(url);
        }
        private function 
geladen(e:Event):void {
            
// fügt den geladenen Clip der Display-Liste hinzu
            
addChild(loader);
            
// macht die Eigenschaften der eigentlichen Klasse verfügbar (Cast: DisplayObject -> MovieClip)
            // statt: loader.content.apparel_mc.panel_mc.x = 50;
            
MovieClip(loader.content).apparel_mc.panel_mc.50;
        }
    }

k-eye ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
as3, externes swf, loader

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele