Loader

Filme laden mit der Loader Klasse

 

Player für SWF-Datei

In diesen AS3 Player wird ein SWF Film geladen. Man hat einen Ladebalken und eine Abspielsteuerung mit Pause und Stop Taste. Außerdem gibt es einen home-Button, der zurück zum Anfang spult, wo man erneut den Film laden kann. Das Beispiel ist wieder auf das nötigste reduziert. Damit man es versteht und sich entsprechend erweitern kann. Siehe auch meinen Tipp-Sound, für einen Sound-on-off Button. Siehe auch den Tipp flashvars, damit ließe sich dieses Beispiel insofern erweitern, dass man die Film-Urls aus einer Datenbank holt. Siehe auch das Beispiel unter Timeline und Display Objekte, damit lassen sich auch Display Objekte des geladenen Films abspielen und stoppen egal wie tief sie verschachtelt sind.

 


function showInfo(anzeigeText:String) {
	info.text=anzeigeText;
}

//---------------------init-------------------------------
home_btn.visible=false;
ladebalken.visible=false;
var request:URLRequest;
var ldr:Loader;
var percentSetup:int;
var mc:*;


//-----------------------Film laden-------------------

function laden(evt:MouseEvent) {
	movi_btn.visible=false;
	home_btn.visible=true;
	request = new URLRequest("film1.swf");
	ldr= new Loader();
	addChild(ldr);
	setChildIndex(ldr,0);
	ldr.load(request);
	ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
	ldr.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
	ldr.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, onProgress );
}

//-------------Error, eine Meldung für alles---------------------

function errorHandler( event:IOErrorEvent):void {
	showInfo("Der Film konnte nicht geladen werden.");
	ldr.close();
}

//----------------------Ladevorgang überwachen-------------------------

function onProgress( event:ProgressEvent ):void {
	ladebalken.visible=true;
	percentSetup = Math.round(((event.bytesLoaded/event.bytesTotal)*100));
	ladebalken.scaleX=percentSetup/100;
	showInfo("loading "+percentSetup+"%");
	if (event.bytesLoaded==event.bytesTotal) {
		showInfo("");
		ladebalken.visible=false;
	}
}


//---------- Ladevorgang startet----------

function initHandler(evt:Event) {
	home_btn.addEventListener(MouseEvent.CLICK, deleteLoader);
	play_btn.addEventListener(MouseEvent.CLICK, abspielen);
	pause_btn.addEventListener(MouseEvent.CLICK, stoppen);
	mc=ldr.content;


	//film abspielen
	function abspielen(evt:MouseEvent) {
		mc.play();
	}
	//film stoppen
	function stoppen(evt:MouseEvent) {
		mc.stop();
	}

	//loader löschen, videowahl einblenden
	function deleteLoader(evt:MouseEvent) {

		home_btn.visible=false;
		movi_btn.visible=true;
		mc.stop();
		if (percentSetup<100) {
			ldr.close();
		}
		if (stage.contains(ldr)) {
			removeChild(ldr);
		}
	}
}


movi_btn.addEventListener(MouseEvent.CLICK, laden);



AS3 mehrere SWF-Filme laden

Hier habe ich eine Klasse TLoader.as und eine fla (laden5.swf), in der über 2 Buttons 2 swf Filme geladen werden. Über den Play und Stop Button kann man die Hauptzeitleiste des geladenen Films steuern. Man kann sich hierbei schnell mal vertun, wenn man damit versucht Filme zu stoppen, deren Animation innerhalb einer MC-Instanz ist oder deren Bewegung programmiert wurde. Auf der Actionscript 3 Seite meiner Tipps findet ihr ein Beispiel, wie man alle Zeitleisten eines geladenen SWF Films stoppen und abspielen kann. Auch wenn Sie mehrmals verschachtelt sind.

Wenn man einen Film lädt der Sound abspielt und dann den Film durch einen andere ersetzt, läuft trotzdem der Sound weiter. Das liegt daran, dass der Sound kein DisplayObject ist und somit nicht automatisch entfernt wird. Der Sound muss also explizit angesprochen werden. Wie man ihn stoppt, könnt ihr in meinem Beispiel sehen.

Für den Inhalt dieser Seite ist eine neuere Version von Adobe Flash Player erforderlich.

Adobe Flash Player herunterladen

Actionscript der laden5.swf


var film:TLoader = new TLoader();
addChild(film);

function starten1(evt:MouseEvent):void {
	film.loadSwf="film1.swf";
}

function starten2(evt:MouseEvent):void {
	film.loadSwf="film4.swf";
}


function stopFilm(evt:MouseEvent):void {
	film.stopFilm();
}

function playFilm(evt:MouseEvent):void {
	film.playFilm();
}


movi1_btn.addEventListener(MouseEvent.MOUSE_UP, starten1);
movi2_btn.addEventListener(MouseEvent.MOUSE_UP, starten2);


stop_btn.addEventListener(MouseEvent.MOUSE_UP, stopFilm);
play_btn.addEventListener(MouseEvent.MOUSE_UP, playFilm);



Actionscript der Klasse TLoader.as


package {
	import flash.display.*;
	import flash.net.URLRequest;
	import flash.events.*;
	import flash.media.SoundMixer;

	public class TLoader extends Sprite {

		private var lader:Loader = new Loader();
		private var request:URLRequest;
		private var clip:MovieClip;



		public function TLoader() {			
		}
		

		public function set loadSwf(swfUrl:String):void {
			SoundMixer.stopAll();
			request=new URLRequest(swfUrl);
			lader.load(request);
			addChild(lader);
			lader.contentLoaderInfo.addEventListener(Event.INIT,laderInhalt);
		}


		private function laderInhalt(event:Event):void {
			var movie:* =lader.content;
			this.clip=movie;
		}


		public function playFilm():void {
			this.clip.play();
		}


		public function stopFilm():void {
			this.clip.stop();
		}


	}
}

Load Movie in AS3 weitere Beispiele

Die folgenden Beispiele sind älteren Datums, als mein Wissenstand noch kleiner war.

Wie lädt man mit Actionscript 3 SWF-Movieclips über Buttons. Dazu habe ich hier ein paar Lösungen, wobei die dritte Lösung eine Verfeinerung der zweiten ist ( laden1.fla / laden2.fla). Die folgenden Flashmovies benutzen die gleiche Klassendatei SwfLader.as Zu dieser Klassendatei schaue man sich das erste Beispiel oben auf der Seite an. Dort ist eine ähnliche Klassendatei aufgeführt und erklärt.

Der Unterschied dieser Klasse zur vorigen TLoader.as ist der, dass ich in der vorigen alles in das gleiche Loader Objekt lade und zwar über eine setter Funktion. Daher muss ich nicht mit removeChild einen zuvor geladenen Film entfernen. Für jeden zu ladenden Film ein eigenes Loader Objekt zu erzeugen macht eigentlich nur dann Sinn, wenn die Filme gleichzeitig laufen sollen.

In den folgenden Beispielen hat man mehrere Buttons mit denen man SWF-Filme lädt. Bei den ersten beiden Beispielen, besteht die Möglichkeit, dass mehrere Filme gleichzeitig laufen. Dazu muss man die Beispiele entsprechend ändern. Im dritten Beispiel wird immer nur ein Film geladen. Hier läuft immer nur der gerade geladene Film.

Achtung!!! Wenn Html-Datei und SWF-Film in verschiedenen Verzeichnissen liegen, gilt bei relativen Pfadangaben (filmURL) die Html-Datei und nicht der SWF-Film als oberste Ebene.

 

Actions der Klassendatei SwfLader.as
Siehe hierzu das Beispiel ganz oben auf der Seite, dort werden Schritt für Schritt die Funktionen erklärt. In dieser Klassendatei befinden sich 2 public functions, die den Film ab Bild 1 abspielen playStart() und den Film stoppen stopFilm(); Diese beiden Funktionen sind für das dritte Beispiel laden3.fla nicht erforderlich, aber Sie fressen kein Brot und von daher braucht man sie auch nicht zu löschen.


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

	public class SwfLader extends Sprite {
		private var lader:Loader;
		private var clip:MovieClip;


		public function SwfLader(urlString:String) {
			var request:URLRequest = new URLRequest(urlString);
			lader = new Loader();
			lader.load(request);
			addChild(lader);
			lader.contentLoaderInfo.addEventListener( Event.INIT, laderInhalt );
		}
		private function laderInhalt( event:Event ):void {
			var movie:* = lader.content;
			this.clip=movie;
		}
		public function playStart():void {
			this.clip.gotoAndPlay(1);
		}
		public function stopFilm():void {
			this.clip.stop();
		}
	}
}

 

laden1.fla
In laden1.fla werden alle Filme sofort geladen, die Buttons zeigen die Filme lediglich an und spielen diese ab Bild 1 ab. Das hat seine Vorteile, aber bei einer großen Anzahl von SWF-Dateien mit großer Dateigröße ist das nicht der Bringer. Wie man sieht wäre es mit einer kleinen Änderung möglich, dass mehrere Filme gleichzeitig laufen.

 


var film1:SwfLader = new SwfLader("film1.swf");
var film2:SwfLader = new SwfLader("film2.swf");
var film3:SwfLader = new SwfLader("film3.swf");
addChild(film1);
addChild(film2);
addChild(film3);
film1.visible=false;
film2.visible=false;
film3.visible=false;
SoundMixer.soundTransform = new SoundTransform(0, 0);



function starten1(evt:MouseEvent):void {
	SoundMixer.soundTransform = new SoundTransform(1, 0);
	film1.visible=true;
	film1.playStart();
	film2.visible=false;
	film3.visible=false;
	film2.stopFilm();
	film3.stopFilm();
}

function starten2(evt:MouseEvent):void {
	SoundMixer.soundTransform = new SoundTransform(1, 0);
	film2.visible=true;
	film2.playStart();
	film1.visible=false;
	film3.visible=false;
	film1.stopFilm();
	film3.stopFilm();
}

function starten3(evt:MouseEvent):void {
	SoundMixer.soundTransform = new SoundTransform(1, 0);
	film3.visible=true;
	film3.playStart();
	film1.visible=false;
	film2.visible=false;
	film1.stopFilm();
	film2.stopFilm();
}

movi1_btn.addEventListener(MouseEvent.MOUSE_UP, starten1);
movi2_btn.addEventListener(MouseEvent.MOUSE_UP, starten2);
movi3_btn.addEventListener(MouseEvent.MOUSE_UP, starten3);

 

 

 

laden2.fla
In laden2.fla werden die Filme erst auf Buttonclick geladen. Hier wurden die Actions von laden1.fla etwas abgeändert. Die ersten beiden Beispiele sollten noch etwas nachgebessert werden. So wären hier noch ein paar Schleifen angebracht. Ich habe bewusst erstmal darauf verzichtet, damit alles ein bischen verständlicher ist.


var film1:SwfLader;
var film2:SwfLader;
var film3:SwfLader;

function filmCheck() {
	if (film1) {
		film1.visible=false;
		film1.stopFilm();
	}
	if (film2) {
		film2.visible=false;
		film2.stopFilm();
	}
	if (film3) {
		film3.visible=false;
		film3.stopFilm();
	}
}


function laden1(evt:MouseEvent) {
	filmCheck();
	film1= new SwfLader("film1.swf");
	addChild(film1);
	movi1_btn.removeEventListener(MouseEvent.MOUSE_UP, laden1);
	movi1_btn.addEventListener(MouseEvent.MOUSE_UP, starten1);
}


function laden2(evt:MouseEvent) {
	filmCheck();
	film2= new SwfLader("film2.swf");
	addChild(film2);
	movi2_btn.removeEventListener(MouseEvent.MOUSE_UP, laden2);
	movi2_btn.addEventListener(MouseEvent.MOUSE_UP, starten2);
}


function laden3(evt:MouseEvent) {
	filmCheck();
	film3= new SwfLader("film3.swf");
	addChild(film3);
	movi3_btn.removeEventListener(MouseEvent.MOUSE_UP, laden3);
	movi3_btn.addEventListener(MouseEvent.MOUSE_UP, starten3);
}

function starten1(evt:MouseEvent):void {
	film1.visible=true;
	film1.playStart();
	film2.visible=false;
	film3.visible=false;
	film2.stopFilm();
	film3.stopFilm();
}

function starten2(evt:MouseEvent):void {
	film2.visible=true;
	film2.playStart();
	film1.visible=false;
	film3.visible=false;
	film1.stopFilm();
	film3.stopFilm();
}

function starten3(evt:MouseEvent):void {
	film3.visible=true;
	film3.playStart();
	film1.visible=false;
	film2.visible=false;
	film1.stopFilm();
	film2.stopFilm();
}

movi1_btn.addEventListener(MouseEvent.MOUSE_UP, laden1);
movi2_btn.addEventListener(MouseEvent.MOUSE_UP, laden2);
movi3_btn.addEventListener(MouseEvent.MOUSE_UP, laden3);


laden3.fla
Diese Lösung ist einfacher und kürzer, denn hier kann immer nur ein Film geladen werden. Bevor ein neuer Film geladen wird, wird der komplette Sound der sich irgendwo innerhalb des Swf-Films oder eines geladenen Films befindet gestoppt. Hat man bezüglich Sound eine andere Konstellation, kann man die Zeile SoundMixer.stopAll(); löschen.

var film:SwfLader;

function laden(filmUrl:String) {
	SoundMixer.stopAll();
	if (film) {
		if (stage.contains(film)) {
			removeChild(film);
		}
	}
	film=new SwfLader(filmUrl);
	addChild(film);
}


function starten1(evt:MouseEvent):void {
	laden("film1.swf");
}

function starten2(evt:MouseEvent):void {
	laden("film2.swf");
}

function starten3(evt:MouseEvent):void {
	laden("film3.swf");
}

movi1_btn.addEventListener(MouseEvent.MOUSE_UP, starten1);
movi2_btn.addEventListener(MouseEvent.MOUSE_UP, starten2);
movi3_btn.addEventListener(MouseEvent.MOUSE_UP, starten3);