Archief - AS3: removeChildAt probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Dieterg

Legacy Member
Ik ben wat aan het proberen in AS3. Ik probeer een banner rotator te maken in AS3 mbv XML. De afbeeldingen en de description laadt perfect in! Nu heb ik een timerevent en een click event om naar de volgende foto te gaan. Als hij naar de volgende foto gaat is er een korte periode dat er 'niks' te zien is op de stage. Wit dus..

Nu werk ik met removechildat omdat ik dacht dat anders de SWF veel te groot zou worden (met al die movieclips).
Code:
			if(_container.numChildren > 0)
			{
				_container.removeChildAt(0);
			}
			
			_container.addChildAt(loader, 0);

De bovenstaande code werkt perfect enkel zit ik hier met het probleem dat ik hierboven omschreven heb.

Nu heb ik de code wat veranderd naar het volgende:
Code:
			if(_container.numChildren > 1)
			{
				_container.removeChildAt(_teller-2);
			}
			
			_container.addChildAt(loader, _teller);

                        _teller++;

Ik heb al veel gespeeld met de getallekes in de if lus. Volges mij gaat het gewoon zo niet? Heeft iemand hier een andere manier voor? Ik had ook het idee om gewoon een nieuwe loader aan te maken?

Ach, ik hoop dat iemand mij wat verder kan helpen! Google kon dat in ieder geval niet.

Zero Grav

Legacy Member
Code:
if(_container.numChildren > 1) {
	_container.removeChildAt(0);
}

_container.addChild(loader);

Elke keer ge removeChildAt(0) doet wordt child 1 > child 0. Dus ge moet niet gaan optellen, ge moet gewoon telkens het onderste kind verwijderen.

Dieterg

Legacy Member
Om alles nu overzichtelijker te maken dacht ik alles in een class te zetten. Ik zit nu eigenlijk al redelijk snel vast.

Tot nu toe bestaat men class uit volgende code
Code:
package
{
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.events.Event;
	import flash.display.MovieClip;
	import flash.display.Loader;
	import flash.display.Sprite;
	
	public class xmlLoad extends MovieClip
	{
		private var _fotoArray:Array = new Array();
		private var _mcMain:MovieClip = new MovieClip();
		
		public function xmlLoad(fileNaam:String, stageWidth:int, stageHeight:int)
		{
			trace("constructor");
			addChild(_mcMain);
			_mcMain.width = stageWidth;
			_mcMain.height = stageHeight;
			
			var xmlLoader:URLLoader = new URLLoader;
		 	var xmlRequest:URLRequest = new URLRequest(fileNaam);
			
			xmlLoader.load(xmlRequest);
			xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
		}
		
		private function xmlLoaded(event:Event):void
		{
			trace("xml loaded");
			var xml:XML = new XML(event.target.data);
			
			for(var i:uint; i < xml.afbeelding.length(); i++)
			{
				_fotoArray.push(xml.afbeelding[i].url);
			}
		}
		
		public function loadPic(index:int):void
		{
			var loader:Loader = new Loader();
			
			loader.load(new URLRequest(_fotoArray[index]));
			
			if(_mcMain.numChildren > 1)
			{
				removeChildAt(0);
			}
			
			_mcMain.addChild(loader);  
		}
		
		public function get ArrayLength()
		{
			trace("return");
			return _fotoArray.length;
		}
	}
}

Als ik nu op men main timeline het volgende doe
Code:
var loader:xmlLoad = new xmlLoad("config.xml", 540, 400);

var arrayLengte:int = loader.ArrayLength;

trace(arrayLengte);

traced hij de arraylengte '0'. Ik weet waar het aan ligt namelijk dat hij de array.length returned voordat de array wordt opgevuld. Ik snap eigenlijk niet goed hoe het komt dat hij dat doet. Want ik maak toch eerst een nieuwe instantie van de klasse xmlLoad?

output window:
Code:
constructor
return
0
xml loaded

edit: Ik heb de de lengte van de array nodig zodat ik geen te hoge index meegeef in de loadpic methode.

Zero Grav

Legacy Member
Sowieso de materie getters en setters eens doornemen. Is eigenlijk voorbehouden om te communiceren met private variabelen, niet de manier waarop gij het doet. Die get zou daar dus niet mogen staan.

Soit, ge maakt inderdaad eerst een instantie van XMLLoad (klasses moeten altijd met een hoofdletter beginnen) aan, maar die klasse heeft tijd nodig om het xml-bestand in te laden en te overlopen. Gij vraagt de waarde al op voor hij dat heeft kunnen doen.


Wat ge kunt doen om dat te voorkomen is in uw xmlLoaded() functie te eindigen met:
Code:
dispatchEvent( new Event( Event.COMPLETE ) );

En dan wordt de code in uw mainklasse:
Code:
var loader:xmlLoad = new xmlLoad("config.xml", 540, 400);
	loader.addEventListener( Event.COMPLETE, xmlLoadCompleteHandler);
	
function xmlLoadCompleteHandler(e:Event):void {
	var arrayLengte:uint = loader.ArrayLength; //uint omdat de lengte van een array altijd positief zal zijn
	trace(arrayLengte);
}

Nog veel beter zou zijn als ge dan uw XMLLoader pas laat beginnen als ge loader.start(); ofzo doet in uw mainklasse, maar dees zal nu normaal ook wel werken.

Dieterg

Legacy Member
Bedankt Zero, het werkt zoals het moet! Enkel snap ik niet zo goed wat je bedoeld, ik gebruik de 'get' functie toch om de lengte van de private variable _fotoArray terug te sturen? Hoe zou je dit dan moeten oplossen zoals het 'hoort'? Nuja, ik heb nog niets van OOP gezien. Dat komt pas volgend semester bij JAVA aan bod! Hartelijk bedankt in ieder geval, ik ben weer een tijdje zoet!

Zero Grav

Legacy Member
Code:
private var _myVar:String;

public function get myVar():String {
     return this._myVar;
}

Een getter slaat terug op een variabele, als het niet terugslaat op een variabele is het op zich gewoon een public function en geen getter meer.

Dieterg

Legacy Member
Oké, bedankt Zero! Ik denk dat ik alle antwoorden op men vragen nu wel heb. Bij deze mag je dit topic dan ook sluiten. Jammer dat ik u geen 2x achtereen reputation kan geven, je verdient het in ieder geval wel!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan