Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 15-08-2002, 23:28   #1 (permalink)
hOk
Neuer User
 
Benutzerbild von hOk
 
Registriert seit: Jun 2001
Ort: berlin
Beiträge: 829
Post listener

Hi,
habe mal eine etwas ältere Klasse von mir ausgegraben,
hatte sie eigentlich verwendet um Methoden von Objekten,
auf bestimmte Ereignisse hin aufzurufen. Es war die Aufgabe,
die Methoden auf enterFrame, mouseDown etc. aufzurufen.

Durch die Inspiration von Bokel, siehe Bokels Blog, ist mir
gerade klar geworden dass man diese Klasse auch noch
in erweiterter Form nutzen kann, in dem man eigene Events
definiert.

Beispielsweise könnte man mehrer Käferobjekte erzeugen.
Und allen eine Methode die() spendieren. Direkt bei der
Käfererzeugung meldet man die Käfer mit ihrer die-Methode
an das Event Amageddon an.
Wenn man jetzt das Event Armageddon abfeuert, sterben
alle Käfer, weil fuer jedes Kaeferobjekt automagically die
die-Methode gefeuert wird. Sorry...;-)
PHP-Code:
/**
 * Klasse:  Basisklasse fuer alle Ereignissabfang-Objekte
 */
function Event_Catcher () 
{
    
this.l_obj = new Array();  // Array mit allen Objekten deren Methode auf Event aufgerufen werden soll
    
this.l_met = new Array();  // Array mit allen Methoden zu den Eventobjekten
    
this.p_l_obj = new Array();  // Array mit allen Objekten die pausiert sind
    
this.p_l_met = new Array();  // Array mit allen Methoden die pausiert sind
}

// Methode die ein neues Eventobjekt zu Liste hinzufuegt
// obj = Objekt, met = Methode
// Beispiel: my_enterFrame.new_listener(obj, "hello");
Event_Catcher.prototype.new_listener = function(objmet) {
    
this.l_obj[this.l_obj.length] = obj;
    
this.l_met[this.l_met.length] = met;
}

// Methode die ein Eventobjekt wieder entfernt
// obj = Objekt
// Beispiel: my_enterFrame.del_listener(obj);
Event_Catcher.prototype.del_listener = function(obj) {
    
    
// Pausierung aufheben
    
this.stop_pause(obj);
    
    var 
this.l_obj.length;
    while (
a--) {
        if (
this.l_obj[a] == obj) {
            
this.l_obj.splice(a1);
            
this.l_met.splice(a1);
        }
    }
}

// Methode die das Event fuer ein Objekt pausieren laesst
// obj = Objekt
// Beispiel: my_enterFrame.start_pause(obj);
Event_Catcher.prototype.start_pause = function(obj) {
    var 
this.l_obj.length;
    while (
a--) {
        if (
this.l_obj[a] == obj) {
            
this.p_l_obj[this.p_l_obj.length] = this.l_obj[a];
            
this.p_l_met[this.p_l_met.length] = this.l_met[a];
            
this.l_obj.splice(a1);
            
this.l_met.splice(a1);
        }
    }
}

// Methode die die Pausierung beendet
// obj = Objekt
// Beispiel: my_enterFrame.stop_pause(obj);
Event_Catcher.prototype.stop_pause = function(obj) {
    var 
this.p_l_obj.length;
    while (
a--) {
        if (
this.p_l_obj[a] == obj) {
            
this.l_obj[this.l_obj.length] = this.p_l_obj[a];
            
this.l_met[this.l_met.length] = this.p_l_met[a];
            
this.p_l_obj.splice(a1);
            
this.p_l_met.splice(a1);
        }
    }
}

// Methode die bei Ereignissen gefeuert wird
Event_Catcher.prototype.my_event = function() {
    var 
this.l_obj.length;
    while (
a--) this.l_obj[a][this.l_met[a]]();
}



/*

 BEISPIEL

*/


/**************************************
 Amageddon-Event-Objekt
**************************************/
my_amageddon = new Event_Catcher();

/**************************************
 Kaefer-Objekt
**************************************/
kaefer = new Object();
kaefer.die = function () { 
   
my_amageddon.del_listener(kaefer);
   
trace(this+" ist gerade verendet"); 
}

// Kaefer-Objekt an das Ereigniss anmelden
my_amageddon.new_listener(kaefer"die");

// um auf alle angemeldeten Kaefer das
// Ereigniss anzuwenden
my_amageddon.my_event(); 
viele nette Grüße, hOk
__________________
gobogo
hOk ist offline   Mit Zitat antworten
Alt 16-08-2002, 00:53   #2 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
Thumbs up

Mensch der Hok ist back

mfg
Matze K.
Madokan ist offline   Mit Zitat antworten
Alt 16-08-2002, 09:30   #3 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Schoen umgesetzt.
Mit ASBroadcaster würde das so aussehen:

ActionScript:
  1. //wg. Bug definieren wir ein eigenes removeListener
  2. ASBroadcaster.removeListener = function(obj){
  3.     for(i in this._listener){
  4.         if(this._listener[i] == obj) delete this._listener[i];
  5.         return 1
  6.     }
  7.     return 0
  8. }
  9.  
  10. KaeferKlasse = function(welt, name){
  11.     trace(name + " hat gerade das Licht der Welt erblickt");
  12.     this.welt = welt;
  13.     welt.addListener(this);
  14.      this.name = name;
  15. }
  16.  
  17. KaeferKlasse.prototype.die = function(){
  18.     trace(this.name + " hat das Zeitliche gesegnet");
  19.     this.welt.removeListener(this);
  20. }
  21.  
  22.  
  23. WeltKlasse = function(anzahlKaefer){
  24.     ASBroadcaster.initialize(this)
  25.     for(var i=0; i<anzahlKaefer; i++){
  26.         dummy = new KaeferKlasse(this, "k" + i);
  27.     }
  28. }
  29.  
  30. Armageddon = new WeltKlasse(10);
  31. Armageddon.broadcastMessage("die");

Interessanterweise gibt es einen Bug in
ASBroadcaster.removeListener, der dafuer
sorgt, das nur jeder zweite Kaefer geloescht
wird
Deshalb steht oben noch ein Ersatz für die
entsprechende Routine, die dann hoffentlich
richtig funktioniert.

mfg r.

Geändert von bokel (16-08-2002 um 10:09 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 16-08-2002, 13:29   #4 (permalink)
hOk
Neuer User
 
Benutzerbild von hOk
 
Registriert seit: Jun 2001
Ort: berlin
Beiträge: 829
Interessant, muss ich aber erstmal
verdauen.
Ich versuch mal ASBroadcaster zu
erklären um zu testen ob ich es verstehe...;-)

1.) ASBroadcaster ist ein Rundfunksprecher-Objekt.

2.) Kann man bei ihm kleine Rundfunksprecher anmelden,
als quasi Moderatoren für eine bestimmte Gruppe von
Zuhörern.
> objModerator = new Object();
> ASBroadcaster.initialize(objModerator);

3.) Können sich bei den Moderatoren kleine Zuhörer-Objekte
anmelden.
> objHoerer = new Object();
> objModerator.addListener(objHoerer);

4.) Kann der Moderator an seine Zuhörer Nachrichten funken,
diese Nachrichten sind Methoden der Zuhörer die Sie ausführen
sollen.
> objModerator.broadcastMessage("die");

Habe ich das richtig verstanden?

netten Gruß, hOk
__________________
gobogo
hOk ist offline   Mit Zitat antworten
Alt 16-08-2002, 13:52   #5 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
ASBroadcaster wird allerdings nur dafuer benutzt, um die
Methoden zwischenzuspeichern und per initialize in die
Instanz zu kopieren.

In meinem Blog habe ich gerade einen neuen
Artikel gepostet, der den kompletten Sourcecode
von ASBroadcaster zeigt und die Originalversion
von MX korrigiert.

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 17-08-2002, 09:50   #6 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Im Kommentar zum Artikel findet ihr eine Komponente,
die den ASBroadcaster-Bug auch für die internen Klassen
behebt.

http://www.helpqlodhelp.com/blog/index.php

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 20-08-2002, 00:21   #7 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
Thumbs up

bokel: Sicher sehr interessant zur Vertiefung

mfg
Matze K.
Madokan 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 15:32 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele