AS3 externe SWF, (Pre)Loader, Benutzereingaben und Verzweiflung

borisfries

Grünschnabel
Hallo Ihr alle :)

Ich habe ein Problem und bin mir beinahe sicher das es wirklich nicht besonders schwierig sein sollte zu lösen. Ich bin neu in der Programmierung und AS3 ist meine erste Sprache, verzeiht mir also bitte alle "Unsauberkeiten" (zumindest vorerst) :)

Aufgabenstellung/Problem:

Ich habe eine Main.swf die auf einer Webseite eingebunden werden soll. Dieser Container soll nacheinander 5 externe SWF Dateien laden. D.h natürlich das die erste abgespielt wird und wenn die zu Ende ist die zweite usw....bei fünf angekommen zurück zu Nr. eins. Zusätzlich dazu sollen am unteren Rand fünf Buttons eingeblendet werden die entsprechend zur aktuellen Animation hervorgehoben werden und vor allen Dingen die Möglichkeit bieten eine entsprechende Animation direkt anzuspringen. Zusätzlich brauche ich natürlich einen Preloader der jeder SWF "vorgeschaltet" wird.

Das klingt auf dem Papier nicht wirklich nach einem großen Problem. Auch wenn Ihr mir vorwerfen mögt ich habe nicht ausführlich genug gesucht sei euch allen gesagt das ich mittlerweile 4 Tage und Nächte damit verbracht habe das Problem zu lösen und sich Verzweiflung bei mir breit macht.

Ich habe eine Dokumentklasse erstellt und zusätzlich dazu eine Main.swf (+ 5 Animation)

Hier erst einmal die Dokumentklasse:

PHP:
package {
	import flash.display.*;
	import flash.net.URLRequest;
	import flash.events.*;
	import flash.utils.Timer;

	public dynamic class LoadAndLoop extends flash.display.MovieClip {;

	var urlContainer:URLRequest = new URLRequest;
	var pfade:Array = new Array("animation01.swf", "animation02.swf",  "animation03.swf", "animation04.swf", "animation05.swf");
	var swfLoader:Loader = new Loader();
	var preloader:Loader = new Loader();
	var preloaderURL:URLRequest = new URLRequest("preloader_ani.swf");
	var currentSelection:int = 0;
	var i:int = 0;
	var container:MovieClip = new MovieClip();

	public function LoadAndLoop():void {

		animationSchleife();

		function animationSchleife():void {

				urlContainer.url = pfade[i];
				swfLoader.load(urlContainer);
				container.addChild(swfLoader);
				swfLoader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
					
				
		}
		function initListener(initEvent:Event):void {

			swfLoader.contentLoaderInfo.removeEventListener(Event.INIT, initListener);
			
			
				swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadingStatus);
				preloader.load(preloaderURL);
				addChildAt(preloader, 0);
				addChildAt(container, 1);
				
				function loadingStatus(evt:ProgressEvent) {
				
				if (Math.round(evt.bytesLoaded) >= Math.round(evt.bytesTotal/3)) {
				
					swfLoader.addEventListener(Event.ENTER_FRAME, checkAniStatus);
				
					}
				}

		
		}
		
		function checkAniStatus(evt:Event):void {

			if (Object(swfLoader.content).totalFrames == Object(swfLoader.content).currentFrame) {

				swfLoader.removeEventListener(Event.ENTER_FRAME, checkAniStatus);
				i++;

				if (i == 5) {
					i = 0;
				}
				removeChild(container);
				animationSchleife();
			}
		}
		

	}
}
}


und hier meine Main.fla bzw Main.swf mit fünf auf der Bühne platzierten Buttons und dem folgenden Code im ersten (und einzigen) Schlüsselbild:

PHP:
button1.addEventListener(MouseEvent.CLICK, showAnimation1);
button2.addEventListener(MouseEvent.CLICK, showAnimation2);
button3.addEventListener(MouseEvent.CLICK, showAnimation3);
button4.addEventListener(MouseEvent.CLICK, showAnimation4);
button5.addEventListener(MouseEvent.CLICK, showAnimation5);

addEventListener(Event.ENTER_FRAME, changeAlpha);


function showAnimation1(evt:MouseEvent) {
				
			i = -1;
			urlContainer.url = pfade[0];
			swfLoader.load(urlContainer);
			container.addChild(swfLoader);
			addChild(container);
			
}

function showAnimation2(evt:MouseEvent) {
				
			i = 0;
			urlContainer.url = pfade[1];
			swfLoader.load(urlContainer);
			container.addChild(swfLoader);
			addChild(container);
			
}

function showAnimation3(evt:MouseEvent) {
				
			i = 1;
			urlContainer.url = pfade[2];
			swfLoader.load(urlContainer);
			container.addChild(swfLoader);
			addChild(container);
			
}

function showAnimation4(evt:MouseEvent) {
				
			i = 2;
			urlContainer.url = pfade[3];
			swfLoader.load(urlContainer);
			container.addChild(swfLoader);
			addChild(container);
			
}

function showAnimation5(evt:MouseEvent) {
				
			i = 3;
			urlContainer.url = pfade[4];
			swfLoader.load(urlContainer);
			container.addChild(swfLoader);
			addChild(container);
			
}


function changeAlpha(enterFrameEvent:Event) {

		if (i == 0) {
			button1.alpha = 0.8;
			button2.alpha = 0.5;
			button3.alpha = 0.5;
			button4.alpha = 0.5;
			button5.alpha = 0.5;
		
		} else if (i == 1) {
			button1.alpha = 0.5;
			button2.alpha = 0.8;
			button3.alpha = 0.5;
			button4.alpha = 0.5;
			button5.alpha = 0.5;
			
		} else if (i == 2) {
			button1.alpha = 0.5;
			button2.alpha = 0.5;
			button3.alpha = 0.8;
			button4.alpha = 0.5;
			button5.alpha = 0.5;
			
		} else if (i == 3) {
			button1.alpha = 0.5;
			button2.alpha = 0.5;
			button3.alpha = 0.5;
			button4.alpha = 0.8;
			button5.alpha = 0.5;
		
		} else if (i == 4) {
			button1.alpha = 0.5;
			button2.alpha = 0.5;
			button3.alpha = 0.5;
			button4.alpha = 0.5;
			button5.alpha = 0.8;
		}

}


Soooo, jetzt bin ich mal gespannt wer schon alles einen Anfall hat weils so e programmiert ist :)

Meine Fragen dazu lauten aktuell (und ich wäre verdammt froh wenn sich mir einer erbarmen könnte):

1.) Wie kann ich sowas effektiver gestalten? Der Aufbau ist ja für mich als Anfänger schon gefühlt "totaler dreck"

2.) GANZ wichtig: wie kann ich die Funktion animationSchleife von meiner main.swf aus aufrufen? Bitte hierzu einmal eine genau syntax, das funktioniert einfach nicht.

3.) Wie kann ich das so programmieren das es keine Probleme ab dem Zeitpunkt gibt an dem der Benutzer klickt? Ich glaube das ein Teilproblem der initListener ist finde allerdings nicht raus wie ich den sinnvoller einsetzen kann....




...ich komme also um es auf den Punkt zu bringen nicht dahinter wie ich auf der einen Seite eine Schleife produziere die entsprechende Zustände abfängt und auf das Ende der Animation wartet um dann die folgende zu laden und gleichzeitig die Möglichkeit habe diese Schleife jederzeit zu verlassen um eine einzelne Animation anzuzeigen um dann wieder automatisch zurück zur Schleife zu springen (an die Animation die der selbst gewählten folgt, nochmal zum Verständnis: ich klick auf Button 3 und Ani 3 wird geladen, wird abgespielt bis zum Ende, Ani 4 wird geladen...5....wieder die 1.......)

So, ich hoffe das hier sprengt nicht völlig den Rahmen und ich würde mich sehr über jeden noch so kleinen Hinweis freuen.

Mit vielen Grüßen, Boris.
 
Zuletzt bearbeitet:
Hi,
ich bin selber kein richtiger coder allerdings fiel mir auf wie Du den "main.swf" code vereinfachen könntest;
//// wobei "Btn" in deinem Library kommt; Wäre auch einfacher wenn ich das ganze Packet haben könnte;-)
Code:
var button:Array = new Array();
var padding:Number = 20;
var buttonAnzahl:int = 5;

function init():void{
	
	for (var i:Number = 0; i < buttonAnzahl; i++) { 
		button[i] = new Btn();
		button[i].count = i;
		button[i].y = stage.stageHeight - button[i].height - padding;
		button[i].x = padding + (i * (button[i].width + padding));
		button[i].addEventListener(MouseEvent.CLICK, showAnimation);
		addChild(button[i]);
	} 
}

function showAnimation(evt:MouseEvent) {

            urlContainer.url = pfade[evt.target.count];
            swfLoader.load(urlContainer);
            container.addChild(swfLoader);
            addChild(container);
			for (var i:Number = 0; i < buttonAnzahl; i++) { 
				button[i].alpha = .5;
			}
			button[evt.target.count].alpha = .8;
}

init();

ich weiß nicht ob das weiterhilft.
 

Neue Beiträge

Zurück