Dynamischer XML-Preloader - Arrayübergabeproblem

  • Themenstarter Themenstarter bluewing
  • Beginndatum Beginndatum
B

bluewing

Hallo zusammen,

mal wieder ein kleines Problemchen. Ich möchte einen dynamischen XML-Preloader bauen, dem ich später verschiedene Arrays übergeben kann. Funktioniert auch alles super, wenn ich den Name des zuvor in _root. definierten Arrays direkt in den Preloader schreibe. Will ich allerdings den Array als Parameter in meiner Funktion übergeben, wird er nicht gefüllt.

So geht's:

PHP:
var container_mc:MovieClip = createEmptyMovieClip("container_mc", getNextHighestDepth());
var backgrounds_xml:XML = new XML;
var backgrounds_arr:Array = Array();

function loadXML(object:XML,path:String,functionOnFinish:Function):Void{
	object.ignoreWhite = true;
	object.load(path);
	trace("start xml preloading");
	object.onLoad = function(success:Boolean){
		if(success){
			trace("finished with xml preloading");
			backgrounds_arr = object.firstChild.childNodes;
			trace("array filled");
			trace("I will now execute a function...");
			functionOnFinish();
		}
	}
}

function loadFirstPic():Void{
	mcLoader.loadClip("Media/bild3.jpg",container_mc);
}

loadXML(backgrounds_xml,"XML/backgrounds.xml",loadFirstPic);

Und so nicht:

PHP:
var container_mc:MovieClip = createEmptyMovieClip("container_mc", getNextHighestDepth());
var backgrounds_xml:XML = new XML;
var backgrounds_arr:Array = Array();

function loadXML(object:XML,array:Array,path:String,functionOnFinish:Function):Void{
	object.ignoreWhite = true;
	object.load(path);
	trace("start xml preloading");
	object.onLoad = function(success:Boolean){
		if(success){
			trace("finished with xml preloading");
			array = object.firstChild.childNodes;
			trace("array filled");
			trace("I will now execute a function...");
			functionOnFinish();
		}
	}
}

function loadFirstPic():Void{
	mcLoader.loadClip("Media/bild3.jpg",container_mc);
}

loadXML(backgrounds_xml,backgrounds_arr,"XML/backgrounds.xml",loadFirstPic);

Wäre nett, wenn da jemand weiter wüsste. Danke und Gruß,

Christoph
 
Hi,

was genau funktioniert denn nicht? Arrays werden in der Regel als Referenz übergeben, so dass Du das auf _root angelegte Array innerhalb der Funktion über seinen lokalen Bezeichner überschreiben kannst.

Ich würde Dir allerdings empfehlen, auf Bezeichner wie "array" und "object" zu verzichten, da es (bei falscher Schreibweise) zu Verwechslungen mit den entsprechenden Klassen kommen kann (im Flashplayer 6 wurde u.a. nicht zwischen Groß- und Kleinschreibung unterschieden, so dass hier Kollisionskonflikte auftreten sollten).

Gruß
.
 
Wenn ich den Array im ersten Codebeispiel trace, werden alle Werte des XML-Objekts angezeigt. Im zweiten Codebeispiel ist das Array leer. (Mit anderen Bezeichnungen habe ich es auch schon versucht, das hilft nichts).


Gruß,

Christoph
 
... die Frage ist, wann und wo versuchst Du, das Array auszugeben?

Poste bitte mal Deinen Code mit der Ausgabefunktion.

Gruß
.
 
Das Array wird erst abgefragt, wenn das gesamte XML-Dokument geladen ist, also in der Funktion "functionOnFinish":

PHP:
var container_mc:MovieClip = createEmptyMovieClip("container_mc", getNextHighestDepth());
var backgrounds_xml:XML = new XML;
var backgrounds_arr:Array = Array();

function loadXML(object:XML,array:Array,path:String,functionOnFinish:Function):Void{
    object.ignoreWhite = true;
    object.load(path);
    trace("start xml preloading");
    object.onLoad = function(success:Boolean){
        if(success){
            trace("finished with xml preloading");
            array = object.firstChild.childNodes;
            trace("array filled");
            trace("I will now execute a function...");
            functionOnFinish();
        }
    }
}

function loadFirstPic():Void{
    mcLoader.loadClip("Media/bild3.jpg",container_mc);
    trace(backgrounds_arr.length);
}

loadXML(backgrounds_xml,backgrounds_arr,"XML/backgrounds.xml",loadFirstPic);
 
Hi,

anscheinend wird die übergebene Referenz aufgelöst, wenn Du das Array komplett überschreibst. Ich hatte den Vorgang zunächst etwa folgendermaßen getestet:
Code:
var the_array:Array = new Array("a", "b", "c");

function setArray(arr, _callback) {
	arr.push("foobar");
	_callback();
}

function traceArray() {
	trace(the_array);
}

setArray(the_array, traceArray);
Ausgabe: "a", "b", "c", "foobar"

Überschreibe ich das Array komplett:
Code:
var the_array:Array = new Array("a", "b", "c");

function setArray(arr, _callback) {
	arr = new Array("1", "2", "3");
	_callback();
}

function traceArray() {
	trace(the_array);
}

setArray(the_array, traceArray);
, so bleibt das Original-Array unberührt (Ausgabe nach wie vor: "a", "b", "c").

Flash übergibt das Array zwar als Objekt, dessen Eigenschaften geändert werden können; legst Du allerdings in der Funktion ein komplett neues Objekt an, so wird das Original nicht überschrieben.

Lösungsvorschlag: Überschreibe das Array nicht komplett, sondern ersetze nur seine Elemente:
Code:
array.splice(0, array.length);
for (var i=0; i<object.firstChild.childNodes.length; i++) {
	array[i] = object.firstChild.childNodes[i];
}

Gruß
.
 
Zurück