Vom geladenem SWF aus auf die Buttons zugreifen


#1
AS3 Vom geladenem SWF aus auf die Buttons zugreifen

Guten Abend zusammen,

ich habe folgendes Scenario:

Ein externes SWF wird mit folgendem Script in ein anderes reingeladen:

import flash.net.URLRequest;

var request:URLRequest = new URLRequest("loader_swf.swf");
var loader:Loader = new Loader()
loader.load(request);
addChild(loader);

loader.x = 0;
loader.y = 0;

Die SWF Datei, die reingeladen wird (loader_swf.swf) hat einen MovieCLip mit einer Loop-Animation drin.

Die SWF Datei, in die"loader_swf.swf" reingeladen wird (loader_test.swf) hat auch einen MovieClip (Instanzname "video_template")- die "loader_swf.swf" wird in den MovieClip reingeladen, mit stopp Button (Instanzname "stop_movie") und play Button (Instanzname "play_video").

Die Frage dazu:

Wie kann ich mit ActionScript die loader_swf.swf beeinflussen, damit diese nach dem reinladen auf die Buttons stop und play reagiert? Die loader_test.swf kann ich leider nicht anfassen. Deshalb muss es irgendwie mit der Datei, die reingeladen wird "eingescriptet" werden.

Mein erster Gedanke war folgender Script, aber es klappt leider nicht wirklich:

stop();

video_template(parent).stop_movie.addEventListener(MouseEvent.CLICK, halteAn);
function halteAn(event:MouseEvent):void{
loop_mc.stop();
}

video_template(parent).play_video.addEventListener(MouseEvent.CLICK, spieleWieder);
function spieleWieder(event:MouseEvent):void{
loop_mc.play();
}

Im Anhang findet Ihr die testdateien die loader_test.swf und die loader_swf.fla sowie die loader_swf.swf.

Falls jemand dazu eine Idee hat wäre ich wirklich dankbar.
Für Fragen stehe ich selbstverständlich gerne zur Verfügung.
 

Anhänge

Zuletzt bearbeitet:

Jens B.

Erfahrenes Mitglied
#2
Soweit ich weiß kann man aus der eingeladenen Datei nicht auf die Objekte der einladenden Datei zugreifen. Man kann mich da aber auch eines besseren belehren :)

Du hast also keinerlei Ahnung, wie die Buttons in der loader_test.swf agieren? Haben die überhaupt schon Funktionen? Wieso hast du keinen Zugriff? Wieso muss die Animation in dem MC bleiben?

Wird denn durch die Buttons der Hauptfilm gestoppt?
 
#3
Hallo Jens,

das Problem ist, dass die Hauptanwendung von jemand Anderem entwickelt wird. Deshalb kann ich auf die Funktionen nicht zugreifen bzw keine Funktionen anpassen oder überschreiben. Es werden in dieser Hauptanwendung meherere SWFs reingeladen.

Dafür weiß ich welche EventListeners die Buttons in der Hauptanwendung haben:

Code:
video_template.play_video.useHandCursor = true;
video_template.play_video.buttonMode = true;
video_template.play_video.addEventListener(MouseEvent.CLICK, video_control);
video_template.stop_movie.useHandCursor = true;
video_template.stop_movie.buttonMode = true;
video_template.stop_movie.addEventListener(MouseEvent.CLICK, video_control);

und die Funktion dazu:
function video_control(e:MouseEvent):void {
	if (e.target.name=="play_video") {
		swf_playing = true;
		currentSWF.play();
	}
	if(e.target.name=="stop_movie") {
				currentSWF.stop();
				swf_playing = false;
}
Das heißt, die Buttons sind instanziert und auf jeden Fall mit einer Funktion versehen.
Aber ich komme überhaupt nicht drauf, wie man diese dann von der geladenen SWF ansprechen kann.
Hätte die geladene SWF keinen Loop in einem Frame sondern eine einfache Animation auf der Hauptzeitleiste, würde ich dieses Problem gar nicht haben, da die Buttons immer auf die Hauptzeitleiste der geladenen Datei reagieren.

Mein Hauptproblem ist also, dass ich die Zeitleiste des reingeladenen MovieClips ansprechen muss.
Würde ich aber den Loop der SWF auf die Hauptzeitleiste legen, so würde der Abspielkopf bei der Steuerung in der Hauptanwendung hin und her springen.

Habe mir schon diverse Lösungen überlegt, drehe mich aber irgendwie nur im Kreis...

Vielen Dank im Voraus, falls du irgendeine Idee dazu hast.
 
Zuletzt bearbeitet von einem Moderator:

Jens B.

Erfahrenes Mitglied
#4
Okay, also die Buttons in der einladenden SWF in irgend einer Weise anzusprechen und umzuschreiben erscheint mir wie der falsche Weg.

Was man machen könnte wäre die Animation im MovieClip irgendwie an die Hauptzeitleiste zu koppeln - leider ist mir kein onStop-Event bekannt, man kann aber irgendwie sowas friemeln wie hier im Anhang (irgendwie funktionieren die Beispiel-Buttons aus der loader_test.swf nicht wirklich, selbst die Hauptzeitleiste wird nicht gestoppt).

Ist alles andere als schön oder elegant, aber sollte funktionieren. Die blinkende Linie ist nur um zu sehen ob die Hauptzeitleiste abgespielt wird oder nicht.
 

Anhänge

#5
Hallo Jens vielen vielen Dank für deine schnelle Rückmeldung,

auf diese Weise Funktioniert es super. Nur da bekomme ich ein Problem mit dem Abspielkopf des Players in der Hauptanwendung, weil dieser durch die zwei Frames hin und her springt.

Ist dir zufällig eine mögliche Lösung bekannt, wie man diese Art vom Script nur in einem Frame ausführen könnte?

Vielen Dank im Voraus
 

Jens B.

Erfahrenes Mitglied
#6
Ja - ich hatte an sowas gedacht wie (pseudocode)

Code:
this.addEventListener(Event.ENTER_FRAME, function(e) {
if(this.isPlaying) loop_mc.gotoAndStop(... wie in der fla ...);
});
Dummerweise funktioniert isPlaying nicht so und gibt undefined. Wie genau springt der Abspielknopf hin und her?
 
#7
Der Abspielkopf macht dann schnelle Sprünge zwischen Anfang, Mitte und Ende...

Danke für den Vorschlag,
so einen Ähnlichen Script habe ich bereits bei anderen Animationen angewendet, nur der funktioniert dann leider solange die Main Timeline läuft:

Code:
var rootPlaying:Boolean;
var lastPlayedFrame:uint=1;
 


addEventListener(Event.ENTER_FRAME, e_vent);

function e_vent(event:Event)
{
   trace(rootPlaying);
    if(lastPlayedFrame+1 == MovieClip(root).currentFrame){
        rootPlaying = true;
				loop_mc.play();

    } else {
        rootPlaying = false;
		if(MovieClip(root).currentFrame != MovieClip(root).totalFrames) {
		loop_mc.stop();
		}
    }
    lastPlayedFrame = MovieClip(root).currentFrame;
}
 
Zuletzt bearbeitet von einem Moderator:
#8
Hallo Jens,
ich habe jetzt die Lösung zu diesem Dilemma:

Code:
stop();
if (MovieClip(parent.parent) != null)
{
     MovieClip(parent.parent).stop_movie.addEventListener(MouseEvent.CLICK, halteAn);
     function halteAn(event:MouseEvent):void
     {
        loop_mc.stop();
     }
     MovieClip(parent.parent).play_video.addEventListener(MouseEvent.CLICK, spieleWieder);
     function spieleWieder(event:MouseEvent):void
     {
        loop_mc.play();
     }
}
Und es funktioniert!

Das einzige, was in meinem ersten Script gefehlt hat - ist die "if" abfrage!

Vielen Dank für deine fleißige Unterstützung.
Sorry dass ich einen neuen Thread aufgemacht habe, ich wollte das Thema einfach anders angehen und dachte, dass in den alten Thread sowieso niemand mehr reinschaut. Kommt aber nicht mehr vor.

Grüße
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge