• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-09-2007, 13:41   #1 (permalink)
flash your mind
 
Benutzerbild von salzblog
 
Registriert seit: Jun 2007
Beiträge: 37
Event einer Klasse an Child-Klasse

Hallo,

wie ich in AS 3.0 ein Event mit Parametern von der GrandChild-Klasse an die Parent-Klasse übergebe, habe ich nunmehr herausgefunden (Custom event mit bubbling).

Wie kann ich allerdings ein Ereignis an eine X-beliebigen Klasse (zum Beispiel Child-Klasse) übergeben?

In meinem Fall instanziere ich in meiner Main.as (Document-Class) eine KeyListener.as (löst KeyboardEvent aus) und eine Display.as.
Innerhalb der Display.as werden wiederum zum Beispiel ShowDisplay1.as und ShowDisplay2.as instanziert.

Nun möchte ich, dass ShowDisplay1.as und ShowDisplay2.as ebenfalls auf das Event hören.

Dabei wäre ersteinmal meine prinzipielle Frage, lässt sich ein Event (am Ende auch mit Parametern) überhaupt in die Richtung weitergeben?

Schon einmal Danke /salzblog

PS: Einer meiner Versuche war, die KeyListener-Klasse zusätzlich jeweils in den SchowDisplay-Klassen zu instanzieren. In dem Fall wird mit addEventListener zwar das Event erkannt, aber dieses hat sich mit jedem weiteren Ereignis aufsummiert. Da ich das Event später auch in anderen Child-Klassen verwenden möchte, kann ich es nicht alleine von den ShowDisplay-Klassen "aufsteigen" lassen.

Geändert von salzblog (07-09-2007 um 13:49 Uhr)
salzblog ist offline   Mit Zitat antworten
Alt 07-09-2007, 13:46   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
link

Hier gibt es einige Threads zu dem Thema.
Omega Psi ist offline   Mit Zitat antworten
Alt 07-09-2007, 14:14   #3 (permalink)
flash your mind
 
Benutzerbild von salzblog
 
Registriert seit: Jun 2007
Beiträge: 37
Hallo Omega Psi,

den Beitrag habe ich schon gelesen, nur leider hilft dieser mir beim Verstehen des Sachverhaltes nicht wirklich weiter.

/salzblog
salzblog ist offline   Mit Zitat antworten
Alt 07-09-2007, 14:48   #4 (permalink)
Moe
public void
 
Benutzerbild von Moe
 
Registriert seit: Jun 2001
Ort: Lusaka
Beiträge: 215
Ich weiß nicht recht, wo dein Problem ist. Du musst jedes Objekt (bzw. eine Methode des Objekts), dass auf Ereignisse reagieren soll, irgendwo als Listener anmelden.

Entweder kannst Du ShowDisplay1 usw. direkt als Listener für KeyEvents registrieren.
Oder, da Du anscheinend schon einen zentralen Listener hast (KeyListener), mach daraus einen EventDispatcher (und schreib ggf. eigene Events, wenn normale KeyEvents für deine Zwecke zu allgemein sind) und registriere ShowDisplay1 usw. dort als EventListener.
Ein EventDispatcher ist ein Objekt, dass selbst Events auslöst (dispatchEvent()) und an dem sich andere per addEventListener() anmelden können.

Oder entgeht mir da gerade etwas grundsätzliches?
__________________
Isn't it idiotic?

Geändert von Moe (07-09-2007 um 14:50 Uhr)
Moe ist offline   Mit Zitat antworten
Alt 11-09-2007, 01:35   #5 (permalink)
flash your mind
 
Benutzerbild von salzblog
 
Registriert seit: Jun 2007
Beiträge: 37
Hallo zusammen,

wie ein EventListener aufgebaut ist addEventListener und dispatchListener eingerichtet werden, habe ich (glaube ich) verstanden.

Code:
dispatchEvent(new KeyEvent(KeyEvent.KEYBOARD_EVENT, true, false, "previous", keyDownCode));
Code:
var keyListener:KeyListener = new KeyListener();
this.addChild(keyListener);
addEventListener(KeyEvent.KEYBOARD_EVENT, addScenario, true);
Ich glaube, dass Problem und mein mangelndes Wissen bezieht sich darauf, dass sich die Scenario1/Scenario2/etc-Klassen in einem anderen package befinden (Projektvorgabe) oder auch nicht sauber samt Listener geslöscht werden.

Vielleicht ist es ja wirklich ganz einfach und ich stehe einfach nur auf dem Schlauch. Für eure Hilfe wäre ich sehr dankbar. ZUm (hoffentlich) besseren Verständnis nochmal den Beispiel-Code:

Prototyp.as (Dokumentenklasse)
PHP-Code:
package com.screen {
    
    
import com.screen.Screen;
    
    
import flash.display.Sprite;
    
import flash.text.TextField;
    
    
import flash.events.*;
            
    public class 
Prototyp extends Sprite {
        
        
trace("open Prototyp");
        
        public function 
Prototyp() {
    
            var 
screen:Screen = new Screen();
            
this.addChild(screen);

            
addEventListener(KeyEvent.KEYBOARD_EVENTaddScenariotrue);
            
        }
        
        public function 
addScenario(event:KeyEvent):void {
            
            
//trace(event.addKeyCode);
                        
        
}
        
    }    
    

Screen.as
PHP-Code:
package com.screen {
    
    
import com.screen.audio.Scenario1;
    
import com.screen.audio.Scenario2;
    
    
import flash.display.MovieClip;
        
    
import flash.events.*;    
    
import flash.utils.*;
    
    public class 
Screen extends MovieClip {
        
        
trace("open Screen");
                
        private var 
scenarioList:Array;
        private var 
scenarioNum:Number;
        private var 
scenarioActivated:Boolean;
        private var 
scenarioClip:MovieClip;
        
        private var 
className:Object;
        private var 
classReference:Class;
        
        public function 
Screen() {
            
            var 
keyListener:KeyListener = new KeyListener();        
            
this.addChild(keyListener);
            
addEventListener(KeyEvent.KEYBOARD_EVENTaddScenariotrue);

            
this.scenarioList = new Array(Scenario1Scenario2);
            
this.scenarioNum = -1;
            
this.scenarioActivated false;

        }
        
        public function 
addScenario(event:KeyEvent):void {
            
            switch (
event.addKeyType) {
            
                case 
"previous":
                    
this.scenarioNum--; 
                    if (
this.scenarioNum 0) { this.scenarioNum scenarioList.length 1; } 
                    
this.changeScenario(scenarioNum);
                    break;
                    
                case 
"next":
                    
this.scenarioNum++; 
                    if (
this.scenarioNum this.scenarioList.length 1) { this.scenarioNum 0; } 
                    
this.changeScenario(scenarioNum);
                    break;
                    
            }        
                    
        }
            
        private function 
changeScenario(scenarioNum:Number) {
            
            if (
scenarioActivated) { delete removeChild(scenarioClip); } 
            
            
className getQualifiedClassName(scenarioList[scenarioNum]);
            
classReference getDefinitionByName(className) as Class;
            
scenarioClip = new classReference();
            
scenarioClip.116.5;
            
scenarioClip.100;
            
addChild(scenarioClip);
            
            
scenarioActivated true;            
            
        }
        
    }
    

Scenario1 (gleich Scenario2):
PHP-Code:
package com.screen.audio {
    
    
import com.screen.audio.*;
    
import com.screen.KeyListener;
    
import com.screen.KeyEvent;
    
import com.screen.Screen;
    
    
import flash.display.MovieClip;
    
    public class 
Scenario1 extends MovieClip {
        
        
trace("open Scenario1");        
        
        public function 
Scenario1() { 

            var 
keyListener:KeyListener = new KeyListener();        
            
this.addChild(keyListener);
            
addEventListener(KeyEvent.KEYBOARD_EVENTtestScenariotrue);
            
        }        
        
        public function 
testScenario(event:KeyEvent):void {
            
            
trace(event.addKeyCode);
        
        }
                
    }
    

Wenn ich die Instanzierung von KeyListener in Scenario1 weg lasse und nur den addEventListener einfüge wird das Ereignis (selbstverständlich) nicht erkannt. Mit der Instanz in Scenario1 und Scenario2 wiederum summieren sich die Ereignisse mit jedem Wechsel zwischen beiden Scenarion auf (bis zum Absturz). Gibt es einen anderen Weg, die Ereignisse an Scenario1 bzw. 2 weiterzugeben oder müssen die Instanzen in Screen.as besser/anders gelöscht werden.

Schon einmal vielen Dank /salzblog

PS: Bei Bedarf kann ich die KeyListener-Klasse noch nachreichen... traces in Prototyp.as und Screen.as zum Testen funktionierten immer einwandfrei

Geändert von salzblog (11-09-2007 um 01:51 Uhr)
salzblog ist offline   Mit Zitat antworten
Alt 12-09-2007, 11:09   #6 (permalink)
flash your mind
 
Benutzerbild von salzblog
 
Registriert seit: Jun 2007
Beiträge: 37
Lösung des Problems

Hallo,

ich habe noch etwas "experimentiert" und herausgefunden, dass beim Wechsel von Scenario1 zu Scenario2 (Löschen der Instanz Scenario1, instanzieren von Scenario2) der addEventListener von Scenario1 nicht automatisch entfernt wird und im Hintergrund weiterläuft. So konnte ich zwar die Ereignisse triggern, jedoch haben diese sich mit zunehmenden Wechsel zwischen den Scenarien aufsummiert und zum Programmabsturz geführt.

Mit einem zustätzlichen addEventListener(Event.REMOVE, ...) wird der keyListener sauber entfernt und die Tastenereignisse über alle Ebenen hinweg sauber getriggert. Zudem lasse ich die Ereignisse aus den Scenarien nicht mehr aufsteigen (bubbled = false);

PHP-Code:
public function Scenario1() {  
     var 
keyListener:KeyListener = new KeyListener();        
     
this.addChild(keyListener);
     
addEventListener(KeyEvent.KEYBOARD_EVENTtestScenariofalse);
     
addEventListener(Event.REMOVEDgarbageCollectorfalse);
}        
        
private function 
deleteListener(event:Event):void {
     
removeEventListener(KeyEvent.KEYBOARD_EVENTtestScenariofalse);
}
        
private function 
testScenario(event:KeyEvent):void {
     
trace(event.addKeyType);

Damit waren eure Ansätze natürlich auch richtig, nur an der Gesamtimplementierung in mein Umfeld hats gehabert. Also noch mal Danke. Hinsichtlich der Sache mit dem Garbage Collector und dessen Verhalten bei AS 3.0 kann ich die Seite gskinner.com (http://www.gskinner.com/talks/resource-management/ - slide 23) empfehlen.

/salzblog

Geändert von salzblog (12-09-2007 um 14:18 Uhr) Grund: zusätzliche Infos
salzblog 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 00:43 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele