Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 14-12-2011, 16:25   #1 (permalink)
Neuer User
 
Registriert seit: May 2007
Beiträge: 180
dispatch und listen über die stage?

Hallo,

ich hatte versucht ein Event aus meiner Hauptklasse zu dispatchen ...

stage.dispatchEvent(new Event("newPosition"))

.. und diesen in einer Klasse (die für Starling benutzt wird) von der stage aus über einen Listener zu empfangen.

stage.addEventListener("newPosition",newPos);

Dieser kommt jedoch irgendwie nicht an. Verstehe ich hier was falsch? Ich hab den Weg über die Stage genommen weil mir die Struktur zur Starling steuernden Klasse nicht klar war (Klassen-Typ wird an Starling Objekt bei der Erzeugung übergeben).

Danke für jede Hilfe

litchi
litchi ist offline   Mit Zitat antworten
Alt 14-12-2011, 16:27   #2 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Wahrscheinlich dispatchst Du das Event bevor der Listener registriert wurde?!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 14-12-2011, 16:33   #3 (permalink)
Neuer User
 
Registriert seit: May 2007
Beiträge: 180
Leider nicht, den Listener gibt es vor dem dispatchen. Hab mal ein Trace an der Stelle eingefügt, listener taucht zuerst auf. Die Events beruhen momentan auch noch auf Mausbewegungen, werden also permanent geschickt.

Die Empfängerklasse ist ein Starling-sprite. Kann das zu Problemen führen? Nun haben die Starling Klassen ja nicht so die direkte Verbindung zu normalen Flash DisplayObjekten .

Geändert von litchi (14-12-2011 um 16:36 Uhr)
litchi ist offline   Mit Zitat antworten
Alt 14-12-2011, 16:41   #4 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.041
stage in der Dokumentklasse != stage in Starling

Doku:
Starling Framework Reference
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick
milchreis ist offline   Mit Zitat antworten
Alt 14-12-2011, 16:42   #5 (permalink)
Neuer User
 
Registriert seit: May 2007
Beiträge: 180
Sehe gerade es wird auch die Starling Event Klasse beim Empfänger benutzt. *Kopfkratz* Mal sehen wie ich da hin komme.

Edit: ah ok, andere Stage Klasse. Muss ich mir da so was wie ne Event-Klasse basteln damit die kommunizieren können?

Geändert von litchi (14-12-2011 um 16:46 Uhr)
litchi ist offline   Mit Zitat antworten
Alt 14-12-2011, 17:02   #6 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von litchi Beitrag anzeigen
ah ok, andere Stage Klasse. Muss ich mir da so was wie ne Event-Klasse basteln damit die kommunizieren können?
Nö, das hat mit dem Event selbst nichts zu tun, sondern nur mit dem EventDispatcher, über den es ausgelöst wird. Wenn stage in Starling ein anderes Objekt ist als in der DisplayList, dann kannst beim einen logischerweise nicht das Event empfangen, das Du im anderen auslöst.

Du musst Dir deshalb entweder überlegen, wie Du in Starling an die stage der Anzeigeliste rankommst, oder Dir ein anderes global verfügbares Objekt suchen. Ich habe mir für solche Fälle mal folgende Klasse zusammengebastelt:
ActionScript:
  1. package net.martinkraft.utils {
  2.     import flash.events.Event;
  3.     import flash.events.EventDispatcher;
  4.    
  5.     /**
  6.      * @author Martin Kraft
  7.      */
  8.    
  9.     public class StaticEventDispatcher extends EventDispatcher{
  10.        
  11.         ////
  12.        
  13.         private static var _instance:StaticEventDispatcher;
  14.        
  15.         ///////////////////////////////////////////
  16.        
  17.         public function StaticEventDispatcher( si:SingleInstance ) {
  18.             super();
  19.         }
  20.        
  21.         ///////////////////////////////////////////
  22.        
  23.         // Instance functions to static
  24.        
  25.         static public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = true):void {
  26.             instance.addEventListener(type, listener, useCapture, priority, useWeakReference);
  27.         }
  28.        
  29.         static public function dispatchEvent(event:Event):Boolean {
  30.             return instance.dispatchEvent(event);
  31.         }
  32.        
  33.         static public function hasEventListener(type:String):Boolean {
  34.             return instance.hasEventListener(type);
  35.         }
  36.        
  37.         static public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
  38.             instance.removeEventListener(type, listener, useCapture);
  39.         }
  40.        
  41.         static public function willTrigger(type:String):Boolean {
  42.             return instance.willTrigger(type);
  43.         }
  44.        
  45.         ////
  46.        
  47.         static public function get instance():StaticEventDispatcher {
  48.             if(!_instance) _instance = new StaticEventDispatcher( new SingleInstance() );
  49.             return _instance;
  50.         }
  51.        
  52.     }
  53. }
  54.  
  55. internal class SingleInstance {
  56.     /// protects Singleton
  57.     public function SingleInstance():void { }
  58. }
...und für den enthalten Singleton auch schon meine Prügel bezogen
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (14-12-2011 um 17:21 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 14-12-2011, 17:44   #7 (permalink)
Neuer User
 
Registriert seit: May 2007
Beiträge: 180
Ja an so was dachte ich.

Nach Abschicken hauen die beiden Event Klassen aufeinander.

TypeError: Error #1034: Typumwandlung fehlgeschlagen: flash.events::Event@435fba1 kann nicht in starling.events.Event umgewandelt werden.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at net.martinkraft.utils::StaticEventDispatcher$/dispatchEvent()....


Im Starling-Forum hatte ich gesehen wie jemand sich die Insanz von der Starlington Stage raus sucht und die Funktoin direkt aufruft. Schien aber älter zu seien da dies bei mir nicht gefunzt hat.
litchi ist offline   Mit Zitat antworten
Alt 14-12-2011, 17:54   #8 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Du musst Dein Event eben auf flash.events.Event typisieren und nicht auf starling.events.Event!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 15-12-2011, 09:34   #9 (permalink)
Neuer User
 
Registriert seit: May 2007
Beiträge: 180
Hmm, stimmt. Kann man denn zwei Klassen mit dem gleichen Namen benutzen? Wenn ich diesen hier mache bekomme ich eine Fehlermeldung dass der Typ nicht eindeutig ist, da ich auch den Starling Event nutze.

private function newPos(e:flash.events.Event):void
litchi ist offline   Mit Zitat antworten
Alt 15-12-2011, 09:39   #10 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von litchi Beitrag anzeigen
private function newPos(e:flash.events.Event):void
Dieser Code sollte aber eigentlich keine Probleme bereiten?! Du darfst nur keine zweite import-Anweisung schreiben!

P.S.: Ich find diese Namensdopplungen in Starling übrigens ziemlichen Blödsinn. Sowas schafft doch nur Verwirrung! Mit einen entsprechenden Vorsilbe wäre es doch genauso eindeutig gewesen?!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (15-12-2011 um 09:41 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 15-12-2011, 09:43   #11 (permalink)
Neuer User
 
Registriert seit: May 2007
Beiträge: 180
Ok, wenn ich das gleiche mit den Starling Events mache dann geht's.
litchi ist offline   Mit Zitat antworten
Alt 15-12-2011, 09:46   #12 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Dieser Code sollte aber eigentlich keine Probleme bereiten?! Du darfst nur keine zweite import-Anweisung schreiben!

P.S.: Ich find diese Namensdopplungen in Starling übrigens ziemlichen Blödsinn. Sowas schafft doch nur Verwirrung! Mit einen entsprechenden Vorsilbe wäre es doch genauso eindeutig gewesen?!
Dafür gibt es ja packages, damit man auf so was wie NSObject etc verzichten kann. Das ist schon besser so.
Omega Psi ist offline   Mit Zitat antworten
Alt 15-12-2011, 09:53   #13 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von Omega Psi Beitrag anzeigen
Dafür gibt es ja packages, damit man auf so was wie NSObject etc verzichten kann. Das ist schon besser so.
Aber gerade bei so Allerweltsklassen (wie Event) sorgt das doch nur für Verwirrung. Mir ist es z.B. ein Rätsel, warum Starling ein eigenes Event-System etabliert, das inkompatibel zu dem der API ist und diese nicht einfach erweitert?! Es würde ja auch niemand auf die Idee kommen eine neue Klasse namens Math zu erzeugen, die nicht typkompatibel ist aber alle Funktionen doppelt?!

Obwohl: Ich schlag mich gerade mit Box2D rum. Die haben auch einfach die Point-Klasse ignoriert und eine eigene Klasse namens b2Vec2 geschrieben - aber die wurde wenigstens nicht identisch benannt.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (15-12-2011 um 09:59 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 15-12-2011, 10:03   #14 (permalink)
Neuer User
 
Registriert seit: May 2007
Beiträge: 180
Jetzt fehlt nur noch die Referenz von Clip der das Event versendet (jetzt wird ja auf die StaticEventDispatcher dispatched), damit ich auf die gewünschten Positonsdaten zugreifen kann. Oder sollte ich mir dazu einen eigenen Event erstellen der die zu übertragenden Daten enthält? Oder gibt es was eleganteres?
litchi ist offline   Mit Zitat antworten
Alt 15-12-2011, 10:28   #15 (permalink)
Neuer User
 
Registriert seit: May 2007
Beiträge: 180
Ok, hab mir dann mal ein DataEvent gemacht um beliebige Daten zu übertragen. Dann erübrigt sich auch die doppelte Event Namensgebung.

PHP-Code:
package
{
    
import flash.events.Event;
    
    public class 
DataEvent extends Event
    
{
        public var 
data:Object = {}; 
        public function 
DataEvent(type:Stringbubbles:Boolean=falsecancelable:Boolean=false)
        {
            
super(typebubblescancelable);
        }
    }


Geändert von litchi (15-12-2011 um 10:32 Uhr)
litchi 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Flash CS4] AS3 stage current frame über Button abfragen persilcolor Flash Einsteiger 1 24-01-2010 12:30
TextFeld auf der Stage über Klassen ansprechen.... Garth ActionScript 3 5 16-07-2008 14:46
'Stage.displayState' nur über Nutzer-Aktion veränderbar? kerstin_mi Flash 8 5 13-09-2007 07:29
dispatch Problem pixelslave ActionScript 2 2 02-09-2007 00:38
Positionen über Listen vergleichen bname ActionScript 1 1 26-09-2002 14:19


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele