Zurück   Flashforum > Flash > ActionScript > ActionScript 2

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-10-2011, 22:57   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 3
Question Variable in AS aus XML erstellen

Hy,

bin noch neu auf dem Gebiet Flash & XML, jetzt sitz ich da vor einem Problem zu dem ich einfach keine Lösung finde.

Ich habe folgendes XML:

Code:
<game count="3">
<eintrag id="1">
<frage>Hier steht eine Frage</frage>
<antwort flag="false">falsche Antwort</antwort>
<antwort flag="true">richtige Antwort</antwort>
<antwort flag="false">falsche Antwort</antwort>
<antwort flag="false">falsche Antwort</antwort>
</eintrag>
<eintrag id="2">
<frage>...
...
Ich möchte nun in AS2 eine Variable flag erstellen, mit der ich auf flag zugreifen kann.

also

var flag = ...

was nach dem = kommt, da bin ich leider noch nicht draufgekommen. Wahrscheinlich irgendwas mit childNodes.attributes od. so, kann mir hier jemand weiterhelfen?

Also das ganze soll ein kleines Quiz werden, 1 Frage mit 4 Antwortmöglichkeiten, dh es gibt 4 Antwortbuttons, bei Klick auf den richtigen soll dann natürlich eine neue Frage aus dem XML kommen, eventuell hilft diese Hintergrundinfo

Geändert von boesl (07-10-2011 um 00:16 Uhr)
boesl ist offline   Mit Zitat antworten
Alt 07-10-2011, 11:56   #2 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 3
ok, flags habe ich mittlerweile ausgelesen und in ein Array gespeichert

Code:
flag = new Array();

xml = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(success){
    if(success){
        for(i=1;i<5;i++){
            flag.push(xml.firstChild.firstChild.childNodes[i].attributes.flag);
			
        }
        trace(flag);
    }
}
xml.load("quiz.xml");
nun möchte ich im weiteren Verlauf 4 Buttons (heißen answer_*_mc --> * steht für die Ziffern 1-4) die Arraywerte von flag zuweisen, dh sie sollen nicht als Text auf den Buttons ausgeben werden, sondern nur gespeichert & bei Klick auf die Schaltfläche mit dem Wert true soll eine neue Frage kommen
boesl ist offline   Mit Zitat antworten
Alt 11-10-2011, 13:28   #3 (permalink)
Webverwickler
 
Benutzerbild von wanst
 
Registriert seit: May 2005
Beiträge: 327
OK, ein paar Sachen zu deinem Einlesemodul:
  1. Wenn schon, dann so for(i=0; i<xml.firstChild.childNodes.length; i++):
    – Arrays fangen bei Null an zu laufen.
    – Und wenn du nicht bei jeder Erweiterung deiner XML auch dein ActionScript mit ändern willst, lässt du die Schleife bis zum Ende der childNode-Einträge laufen und nicht bis zu einer festgelegten Zahl: .length.
    Es gibt zwei Alternativen zu dieser Vorgehensweise:
    1. for (i in xml.firstChild.childNodes) durchläuft genauso alle Elemente, allerdings rückwärts (ist manchmal unpassend).
    2. in deinem Fall kannst du aber direkt auf die IDs zugreifen: xml.idMap[1] zum Beispiel.

  2. mit firstChild.firstChild... erreichst du nur den ersten Eintrag, für die anderen musst du eine zweite Schleife innerhalb der ersten laufen lassen:
    for (j=0; j < xml.firstChild.childNodes[i].childNodes.length; j++)
    Also im Ganzen:
    PHP-Code:
    for (i=0ixml.firstChild.childNodes.lengthi++) 
    {
        for (
    j=0j<xml.firstChild.childNodes[i].childNodes.lengthj++)
        {
            
    // tu was mit:
            
    xml.firstChild.childNodes[i].childNodes[j]
        }

    Oder mit der idMap:
    PHP-Code:
    // einen Eintrag (hier den zweiten) direkt ansprechen:
    for (i in xml.idMap[2].childNodes)
    {
        
    // tu was mit:
        
    xml.idMap[2].childNodes[i]
    }
    //
    // oder alle Einträge:
    for (i in xml.idMap
    {
        for (
    j in xml.idMap[i]) 
        {
            
    // tu was mit:
            
    xml.idMap[i].childNodes[j]
        }

  3. mit flag.push hast du keine Kontrolle, an welcher Stelle im Array der Wert abgelegt wird. Das ist unsauber und wird insbesondere bei for (i in ...) zum Problem, weil das wie gesagt das Array rückwärts durchläuft.
    Besser ist hier:
    PHP-Code:
    flag[j] = xml.idMap[i].childNodes[j].attributes.flag

Nur interessehalber: was fängst du denn mit dem flag-Array an? Warum gibst du den Wert des flag-Attributes nicht gleich dem Button mit und lässt den, wenn er geklickt wird, diesen Wert weiterreichen? Also, jetzt mal als Schnellschuss:
PHP-Code:
// ... div. Vorgeplänkel zum XML-Einlesen
var ergebnisse:Array = new Array();
//
// alle Ergebnisse erstmal als falsch beantwortet setzen (kannst du dir sparen, wenn es noch die Option 'überspringen' geben soll:
for (i in xml.idMap
    
ergebnisse[i] = false;
var 
frageNummer:Number 0;
//
// Button bauen:
var abstand 50;
var 
bauAntwortButtonMitText:Function = function (antwortNummer:NumberantwortText:StringkorrektBeantwortet:String)
// ACHTUNG:
// 'korrektBeantwortet' ist der STRING aus dem XML, kein BOOLEAN – beliebte Fehlerquelle, 
// denn auch wenn korrektBeantwortet den STRING-Wert "false" hat, ergibt die Abfrage if (korrektBeantwortet) ein TRUE.
// FALSE gäbe es nur, wenn korrektBeantwortet leer wäre, 0 oder false (ohne ")
{
    var 
b:MovieClip _root.attachMovie('buttonMitTextFeld','button'+antwortNummer_root.getNextHighestDepth(), {_y:(antwortNummer*abstand)} );
    
b.meinTextFeld.text antwortText;
    
b.korrektBeantwortet korrektBeantwortet // das rechte 'korrektBeantwortet' ist das aus der Funktionsübergabe
    
b.onRelease = function () 
    {
        
//
        // als BOOLEAN abspeichern:
        
ergebnisse[frageNummer] = this.korrektBeantwortet == "true" true false;
        
//
        // aufräumen: Buttons, Frage- und Antworttexte löschen
        /* ... */
        //
        // neue Frage aufrufen:
        
frageNummer++;
        
neueFrage();
    }
}
//
// Frage und Antworten bauen
var neueFrage:Function = function () 
{
    for (
i in idMap[frageNummer]) 
    {
        switch(
xml.idMap[frageNummer].childNodes[i].nodeName
        {
            case 
"frage":
            
bauFrage(xml.idMap[frageNummer].childNodes[i].firstChild.nodeValue);
            break;

            case 
"antwort":
            
bauAntwortButtonMitText(ixml.idMap[frageNummer].childNodes[i].nodeValuexml.idMap[frageNummer].childNodes[i].attributes.flag);
            break;
        }
    }
}
neueFrage(); 
So, jetzt ist die Antwort ausführlicher als die Fragen. Ich hoffe, es hilft.
__________________
Gruß
Wanst

Reden ist Silber, Schweigen ist Gold! ... Meistens

Geändert von wanst (11-10-2011 um 13:33 Uhr)
wanst ist offline   Mit Zitat antworten
Alt 11-10-2011, 14:20   #4 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 3
Zitat:
Zitat von wanst Beitrag anzeigen
Nur interessehalber: was fängst du denn mit dem flag-Array an? Warum gibst du den Wert des flag-Attributes nicht gleich dem Button mit und lässt den, wenn er geklickt wird, diesen Wert weiterreichen?
also das ist genau das was ich eigentlich brauchen werde, wie gesagt, bin noch neu in der Materie und dachte mir ich muss die Flags mal in ein Array speichern, dieses dann an die Buttons übergeben usw.

& dabei hab ich dann mein Problem bekommen, da ich überhaupt keinen Plan hatte wie ich das jetzt am Besten bewerkstelligen soll.
Danke mal für deine ausführliche Antwort, werde sie jetzt mal probieren zu verarbeiten...

Also den Befehl idMap kannte ich zB gar nicht - idMap[1] wäre bei meiner XML zB game countg, idMap[2] eintrag id, idMap[3] frage usw, liegt ich da jetzt richtig?

Geändert von boesl (11-10-2011 um 14:25 Uhr)
boesl ist offline   Mit Zitat antworten
Alt 19-10-2011, 03:40   #5 (permalink)
Webverwickler
 
Benutzerbild von wanst
 
Registriert seit: May 2005
Beiträge: 327
Zitat:
Zitat von boesl Beitrag anzeigen
Also den Befehl idMap kannte ich zB gar nicht - idMap[1] wäre bei meiner XML zB game countg, idMap[2] eintrag id, idMap[3] frage usw, liegt ich da jetzt richtig?
Nee, die idMap ist, wie der Name schon sagt ein Array über die IDs, die du selbst vergeben hast, also in deinem Fall:
PHP-Code:
idMap[1]:
<
eintrag id="1">
    <
frage>Hier steht eine Frage</frage>
    <
antwort flag="false">falsche Antwort</antwort>
    <
antwort flag="true">richtige Antwort</antwort>
    <
antwort flag="false">falsche Antwort</antwort>
    <
antwort flag="false">falsche Antwort</antwort>
</
eintrag>

idMap[2]:
<
eintrag id="2">
    <
frage>... 
Mehr IDs hast du nicht vergeben. das count-Attribut zähl da nicht dazu.

Das besondere daran ist, dass die IDs völlig unabhängig von der Struktur des XML sind. Das Attribut id="" kannst du jedem Tag mitgeben, egal an welcher Stelle in der Hierarchie er steht.
PHP-Code:
<a>
    <
b id="4">
        <
c>bla</c>
        <
c id="2">blub</c>
    </
b>
    <
b>
        <
c id="5">miiiiiiiiampphh</c>
        <
c id="0">schladong</c>
    </
b>
</
a
Die IDs müssen übrigens keine Zahlen sein, wichtig ist nur, dass sie eindeutig sind (also die gleiche ID nicht mehrmals vorkommt).
__________________
Gruß
Wanst

Reden ist Silber, Schweigen ist Gold! ... Meistens

Geändert von wanst (19-10-2011 um 03:42 Uhr)
wanst ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
actionscript 2.0, flash, spiel, xml

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Flash 8] Variable mit einer Variable erstellen Zarr Flash Einsteiger 2 02-08-2009 21:47
XML-Variable erstellen offroadkohler ActionScript 2 1 17-03-2008 23:00
Variable dynamisch erstellen deak Flash CS3 Professional 4 15-02-2008 12:33
Objekt-Name aus Variable erstellen?! startupboy ActionScript 1 4 10-02-2005 21:11
Variable Variablen erstellen Bash-t ActionScript 1 4 25-11-2004 18:14


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele