Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-03-2009, 05:10   #1 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Beiträge: 6
Unhappy Objekteigenschaft bzw Instanz Varibale ändern - komme nicht mehr weiter

hallo,
ich brauche dringend hilfe bei folgendem beispiel, ich sitze hier schon seit bestimmt 5 stunden und komme einfach nicht weiter, ich glaube ich habe irgendwie ein brett vorm kopf!

PHP-Code:
package {

    
import flash.events.*;
    
import flash.xml.*;
    
import flash.net.*;
    
import flash.media.*;
    
    public class 
Mp3Player {
        public var 
playList:Array = new Array();
        
        public function 
Mp3Player() {
            
this.playList = new Array("testeintrag alt");
        }
        
        public function 
loadXML():void {
            var 
xmlFile:URLRequest = new URLRequest("songs.xml");
            var 
xmlLoader:URLLoader = new URLLoader(xmlFile);
            
xmlLoader.addEventListener(Event.COMPLETEloadPlaylist);
        }
        
        private function 
loadPlaylist(event:Event):void {
            var 
xml:XML = new XML(event.target.data);
            
xml.ignoreComments true;
            
xml.ignoreWhite true;
            
            
playList[0] = "testeintrag neu";
        }
        
        public function 
ausgabe() {
            
trace("nach änderung: "+this.playList[0]);
        }
    }
}

der aufruf erfolgt aus der hauptzeitleiste mit
PHP-Code:
var test:Mp3Player = new Mp3Player();
test.loadXML();
test.ausgabe();
stop(); 
Die Ausgbe lautet immer >>> testeintrag alt
warum wird nicht der neue wert ausgegeben?

der code mach folgendes. er liest eine xml datei ein, wenn das laden abgeschlossen ist wird mittels eines eventhandlers auf die methode loadPlaylist zugegriffen in welcher ich die xml daten an ein array übergeben möchte. dieses array ist eine object eigenschaft und sollte nachdem ich es in der methode loadPlaylist geändert habe diese änderung ja auch übernehmen.
Mein Problem ist allerdings das dies aus irgendeinem Grund nicht funktionieren möchte, ich komme aber einfach nicht drauf warum.

wenn ich den wert in der methode loadXML ändere, wird dies übernommen, allerdings nicht in der methode in der das event behandelt wird.

ich brauche echt hilfe... meine geduld ist auch langsam am ende, ich bin seit 5-6 stunden an diesem problem und komme einfach nicht weiter!
reloaded ist offline   Mit Zitat antworten
Alt 26-03-2009, 07:33   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Du wartest beim Nutzen der Klasse nicht, bis die Daten geladen sind.
Omega Psi ist offline   Mit Zitat antworten
Alt 26-03-2009, 07:39   #3 (permalink)
Raven-Kid
 
Benutzerbild von [RK]
 
Registriert seit: Feb 2006
Beiträge: 350
das alte Lied ... das Ladeverhalten (in Flash) ist asynchron.
Die onComplete Events gibts nicht ohne Grund und dabei verwendest du bereits einen x)

Also den Aufruf von ausgabe() in die loadPlaylist Methode

Geändert von [RK] (26-03-2009 um 07:41 Uhr)
[RK] ist offline   Mit Zitat antworten
Alt 26-03-2009, 10:52   #4 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Beiträge: 6
hallo,
danke erstmal für die antworten.
dass wenn ich die ausgabe aus der methode loadPlaylist aus aufrufe die richtige ausgabe liefert habe ich auch schon festgestellt.
jedoch finde ich das ein bischen unpraktisch. was ist wenn ich später aus einer anderen methode auf eben die eigenschaft playList[x] zugreifen möchte? das würde ja heisen das dies nicht geht, eben nur aus der methode loadPlaylist raus.
gibt es da nicht noch eine andere lösung?
ich habe später vor eine methode mit dem namen playSong() zu implementieren, diese soll das auf eben diese eigenschaft zugreifen, aber das problem ist das diese immer noch den altern wert bekommt. ich muss noch anmerken das ich mit as3 noch nicht allzu vertraut bin, ist halt schon etwas komplexer als as2, daher wäre ich über code beispiele sehr dankbar! ich habe auch schon einiges über eventdispathcer gelesen aber schlau werde ich daraus auch nicht, irgendwie habe ich auch noch nicht den unterschied zischen eventdispatcher und eventlistener raus, ...ist es der das beim dispatcher eigene werte übergeben werden und beim listener eben fest hinterlegte events gesendet werden?

Geändert von reloaded (26-03-2009 um 11:23 Uhr)
reloaded ist offline   Mit Zitat antworten
Alt 26-03-2009, 12:40   #5 (permalink)
Neuer User
 
Benutzerbild von padavan
 
Registriert seit: Apr 2002
Beiträge: 496
du könntest dir auch events dispatchen und in der timeline abfangen - dann brauchst du die methoden nicht in der klasse "verketten"

also in loadplaylist einfach neues event auslösen:
PHP-Code:
dispatchEvent(new Event("loaded")); 
und in der zeitleiste auf das event einen listener erstellen
PHP-Code:
mp3playerInstanz.addEventListener("loaded"myFunction); 
und dann die ausgabe()

wenn du später auf die playlist zugreifen möchtest ohne neu laden musst du halt sicherstellen dass sie vorher schon geladen wurde - zb über eine private var in der klasse mit einer getter-methode für den zugriff
__________________
Grafik - Webdesign - Programmierung - www.thsc.at
Adventkalender 2011 advent.wien.info/de
Jobspace - Universum der Lehrstellen www.jobspace.at
padavan ist offline   Mit Zitat antworten
Alt 26-03-2009, 13:59   #6 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Beiträge: 6
@padavan
genial, von der theorie her genau das was ich im prinzip gebraucht habe, kann es nur leider erst heute abend testen, aber der anstaz ist genau der richtige da ich aus der hauptzeitleiste die entsprechenden methoden der klasse mp3player aufufen möchte und nicht über die methode loadPlaylist() selbst!

also ich hoffe das ich es soweit richtig interpretiert habe, mir geht es aber zusätzlich noch darum den genauen unterscheid zwischen einem EventListener und einem EventDispatcher in erfahrung zu bringen, für mich ist nur ersichtlich das ein eventlistener auf eine bestimmtes event wartet, welches in flash fest definiert ist, mitteles des disptachers jedoch auf ein belibiges ereignis regaiert werden kann, welches ich selbst definieren und an belibiger stelle abfragen kann.

BITTE KORRIGIERT MICH WENN ICH DAMIT FLASCH LIEGE! ...damit ich endlich mal in as3 durchblicke! die flash hilfe war für mich leider nicht gerade verständlích im bezug auf dieses thema.
reloaded ist offline   Mit Zitat antworten
Alt 26-03-2009, 14:27   #7 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
  • Event: Events werden verwendet um Ereignisse zu abstrahieren von denen man nicht weiss wann, bzw. ob sie eintreten (daher der passende Name). Events werden zum einen durch ihre Klassen differenziert als auch durch ihre Typen. Typen sind in der Regel über Konstanten definiert, können aber auch frei wählbare Literale sein.
  • EventDispatcher: Die EventDispatcher Klasse erlaubt es Ereignisse auszulösen/zu feuern (vgl. IEventDispatcher.dispatchEvent).
  • EventListener: Um nun auch auf ausgelöste Events reagieren zu können, bedarf es EventListener. EventListener sind Methoden, die dadurch definiert sind, dass sie genau ein Argument erwarten (eine Event Instanz). Sie werden unter zwei Bedingungen aufgerufen: ein EventDispatcher muss die Funktion via addEventListener registriert haben und eine Event muss mit dispatchEvent gefeuert werden. Der EventDispatcher, der die Funktion registrierte, ruft die Funktion auch auf, jedoch kann einen Funktion von beliebigen IEventDispatcher Instanzen registriert werden. EventListener lauschen dementsprechend nicht, wie es der Name vermuten lässt.

    Eine Ausnahme machen Bubbling- und Capture-Phasen der Events in der DisplayList. Die Events werden durch de Hierarchie von der Wurzel auf den kürzesten Weg zum Event.target durchgereicht (Capture-Phase) um dann wieder zurück zur Wurzel gereicht zu werden (Bubbling-Phase).
Ich hoffe das hilft etwas für's Verständnis.
Omega Psi ist offline   Mit Zitat antworten
Alt 28-03-2009, 02:10   #8 (permalink)
Neuer User
 
Registriert seit: Mar 2009
Beiträge: 6
ersteinmal danke für die antworten, diese haben zwar nicht eins zu eins so funktioniert aber sie haben mich definitiv auf den richtigen weg gebracht so das es nun so funktioniert wie es soll.
falls jemand die lust hat, wäre es super einmal die relevanten stellen im code zu überfliegen um mir zu sagen ob diese implementierung dem, sagen wir mal, standart entspricht oder ob es eher quick and dirty ist. besonders interessant für mich wäre es noch zu wissen was der unterschied zwischen
public var testDispatcher1:IEventDispatcher = new IEventDispatcher();
und
public var testDispatcher2:EventDispatcher = enw EventDispatcher();
ist.
die unrelevanten teile der Klasse und des aufrufes habe ich im folgenden code entfernt...



...soviel also dazu...
leider bin ich wärend der weiteren arbeit auf ein weiteres porblem gestoßen, und zwar rufe ich die klasse ja aus der hauptzeitleiste auf, funktioniert alles super. auf der bühne habe ich dann movieclips aus meiner bibliothek plaziert und mit einem instanz namen versehen. über die hauptzeitleiste kann ich diese auch super über den instanznamen ansprechen, zB trace(muteSymbol.width). jedoch wollte ich eben diese, schon auf der bühne platzierten movieclips aus methoden meiner klasse Mp3Player bearbeiten, bzw deren eigenschaften auslesen/ändern.

EDIT: habe mal bezüglich des ansprechens der mc's einen neuen thread eröffnet, denke das ist besser als das hier zu diskutieren
http://www.flashforum.de/forum/showt...76#post1847576

jetzt stehe ich allerdings vor dem, für mich, riesen problem das diese mc's nicht aus der klasse über ihre instanznamen angesprochen werden können und ich auch keine ahnung habe wie dies gehen soll.

ein ansatz von mir war es das ich die mc's aus der bibliothek für as verfügbar mache und diese dann mit zB: var m:MuteSymbol = new MuteSymbol(); und anschließendem addchild(m) auf die bühne bringe, diese sind innerhalb einer methode der klasse instanzieert worden wodurch ich zugriff auf deren eigenschaften etc habe, natürlich mit definierten eventlistener für addedonstage.

da ich die mc's über drag & drop auf der bühne allerdings kompfortabler plazieren und arrangieren kann und ich zudem definitiv nur eine instanz dieser mc's brauche würde mich dringend interesserien wie ich diese aus meiner klasse ansprechen kann. zur errinerung, ich möchte keine neune objekte von mc's aus der bibliothek erstellen und diese ansprechen sondern mc's, welche sich ab frame1 der hauptzeitleiste auf der bühne befinden und über ienen instanznamen verfügen.

PHP-Code:
package {

    
import flash.events.*;
    
import flash.xml.*;
    
import flash.net.*;
    
import flash.media.*;
    
import flash.display.*;
    
    public class 
Mp3Player extends Sprite{
        ...
        public var 
testDispatcher:IEventDispatcher;
        public var 
playList:XML;
        
        public function 
Mp3Player():void {

                        ...
            
this.channelMedia = new SoundChannel();
            
this.testDispatcher = new EventDispatcher();
            ...
        }
        
        public function 
loadXML():void {
            var 
xmlFile:URLRequest = new URLRequest("songs.xml");
            var 
xmlLoader:URLLoader = new URLLoader(xmlFile);
                        
xmlLoader.addEventListener(Event.COMPLETEloadPlaylist);
        }
        
        private function 
loadPlaylist(event:Event):void {
            
this.playList = new XML(event.target.data);
            
this.playList.ignoreComments true;
            
this.playList.ignoreWhite true;
                      
this.totalMedia this.playList.song.length();
            
                        ...
hier habe ich dann das event dispatchtwas vorher gefehlt hat
                        this
.testDispatcher.dispatchEvent(new Event("xmlLoaded"));
        }

        public function 
playSong():void {
            
            ...
            
showTrackInfo("test");
            
this.channelMedia.addEventListener(Event.SOUND_COMPLETEcompleteMedia);
        }
        
        public function 
changeVolume(volume:Number):void {
            ...
        }
        
                ...
diese funktion wird aus der hauptzeitleiste aufgerufen wenn das dispatchte event empfangen wird
        
public function completeMedia(e:Event):void {
            
this.playSong();
        }
    }

und hier der aufruf und der listener in der hauptzeitleiste
PHP-Code:
var player:Mp3Player = new Mp3Player();
addChild(player);
player.loadXML();

...
behandlung des events...
player.testDispatcher.addEventListener("xmlLoaded"eventListener);
function 
eventListener(e:Event) {
    if(
e.type=="xmlLoaded") {
        
player.playSong();
    }


testDispatcher:IEventDispatcher

leider

Geändert von reloaded (28-03-2009 um 02:52 Uhr)
reloaded ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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



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

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


Copyright ©1999 – 2012 Marc Thiele