Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 12-02-2012, 15:45   #1 (permalink)
Neuer User
 
Benutzerbild von zarevok
 
Registriert seit: Jun 2004
Beiträge: 51
MouseEvent und Klassen

Hallo Forum,

Ich weiss, dieses Thema gabs schonmal, aber ich probiers seit gestern abend und komme nicht weiter, ich versteh das Grundprinzip irgendwie nicht... Und mein AS3 Buch von Galileo Design geht da leider nicht so ins Detail.
Also hier mein Problem.

1. Ein MC in der Bibliothek, mit dem Klassennamen button(über rechtsklick -> Eigenschaften)

2. eine button.as Datei im selben Ordner wie die Hauptdatei und folgendem Inhalt:
Code:
package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	
	public class button extends flash.display.MovieClip{

		addEventListener(MouseEvent.MOUSE_MOVE, follow);
	
		public function follow(evt:MouseEvent){
			trace("do stuff");
		}
	}
}
3. In der Hauptszene (main.fla) im 1. Frame von einem steht:
Code:
var bt1:button = new button();
bt1.x = 250;
bt1.y = 200;
addChild(bt1);
Und ich krieg folgende Fehler:
Code:
button.as, Zeile 7    -    1180: Aufruf einer möglicherweise undefinierten Methode addEventListener.
button.as, Zeile 7    -    1120: Zugriff auf eine nicht definierte Eigenschaft follow.
Ich hab mir das schon durchgelesen mit dem, dass man das im stage abfangen muss(?) oder so.
Aber ich versteh das ganze irgendwie nicht so ganz.

Ich möchte gerade mein Verständnisproblem näher ausführen aber ich stell grad fest, ich weiss granicht wo sich das Objekt eigentlich befindet, wo das MouseEvent ist und der addEventListener und wo ich was hin "referenzieren" muss damit jeder mit jedem kommunizieren kann und so.

Hab mir das hier schon angeschaut: Zugriff auf stage von Klasse aus
und diverse andere Links, aber ich versteh das Funktionsprinzip nicht.

Ich hab hier auch dieses Bild (So ähnlich ists im Buch, ohne das Flex unten)

sagt mir aber auch nicht so wirklich viel.

Kann mir das einer Erklären oder sagen wo ich das lernen kann?
Vieleicht hab ich ja auch falsch gesucht.

MfG zarevok

Geändert von zarevok (12-02-2012 um 15:45 Uhr) Grund: fehler korrigiert
zarevok ist offline   Mit Zitat antworten
Alt 12-02-2012, 16:04   #2 (permalink)
Neuer User
 
Benutzerbild von zarevok
 
Registriert seit: Jun 2004
Beiträge: 51
Ich habe eine andere Lösung gefunden, die allerdings nicht wirklich so aussieht wie das was ich vor hab:


button.as

Code:
package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	
	public class button extends flash.display.MovieClip{

		public function follow(mousex, mousey){
			x = mousex;
			y = mousey;
		}
	}
}

main.fla

Code:
var bt1:button = new button();
bt1.x = 250;
bt1.y = 200;
addChild(bt1);

bt1.addEventListener(MouseEvent.MOUSE_MOVE, doit);

function doit(evt:Event):void{
	stage.addEventListener(MouseEvent.MOUSE_MOVE,
	function(evt:MouseEvent) {
	   var mousex:Number = stage.mouseX;
	   var mousey:Number = stage.mouseY;
							   
	   bt1.follow(mousex, mousey);
   });

}
Mein Ziel ist es nämlich eigentlich, dass die ganzen Funktionen und alle Dinge mit EventListenern und so in der Klasse ablaufen soll die es auch betrifft, dass ich nachher z.B. aus der Hauptdatei nurnoch schreiben muss
Code:
bt1.follow();
Und Die Methode der Klasse soll dann den Eventlistener hinzufügen, abfragen per Enter_Frame ob das noch aktuell ist etc.

Aber wie gesagt ich weiss nicht wie ich zwischen der Hauptdatei und den Klassen herumspringen kann.
zarevok ist offline   Mit Zitat antworten
Alt 12-02-2012, 16:21   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
Code:
	public class button extends flash.display.MovieClip{

		addEventListener(MouseEvent.MOUSE_MOVE, follow); <--- das liegt ja ausserhalb  einer function
	
		public function follow(evt:MouseEvent){
			trace("do stuff");
		}
	}
Code:
package {
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class MyButton extends MovieClip {

		public function MyButton() {
			addEventListener(Event.ADDED_TO_STAGE, eventAddToStage);
		}
		
		private function eventAddToStage(evt:Event) {
			removeEventListener(Event.ADDED_TO_STAGE, eventAddToStage);
			addEventListener(Event.REMOVED_FROM_STAGE, eventRemovedFromStage);
			addEventListener(MouseEvent.MOUSE_MOVE, follow);
		}
		
		private function eventRemovedFromStage(evt:Event) {
			removeEventListener(Event.REMOVED_FROM_STAGE, eventRemovedFromStage);
			removeEventListener(MouseEvent.MOUSE_MOVE, follow);
		}
		
		
		private function follow(evt:MouseEvent) {
			trace("do stuff");
		}
	}
}
zu der grafik:
- alles ist Object und hat dessen eigenschaften und methoden
- EventDispatcher erbt von Object, jetzt können wir nachrichten versenden
- DisplayObject erbt von EventDispatcher, jetzt haben etwas, das auf die bühne gebracht werden kann
- InteractiveObject erbt von ...
...
- MovieClip z.b. kann sehr viel, 'wiegt' dann aber auch ganz schön.

langt das zum verständnis?
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (12-02-2012 um 16:29 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 12-02-2012, 16:26   #4 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.040
Na, wenn wir erst auf die stage warten und dann nichts mit ihr anfangen, wird sie bestimmt die beleidigte Leberwurst spielen.

PHP-Code:
package {
    
import flash.display.MovieClip;
    
import flash.events.Event;
    
import flash.events.MouseEvent;

    public class 
MyButton extends MovieClip {

        public function 
MyButton() {
            
addEventListener(Event.ADDED_TO_STAGEeventAddToStage);
        }
        
        private function 
eventAddToStage(evt:Event) {
            
removeEventListener(Event.ADDED_TO_STAGEeventAddToStage);
            
addEventListener(Event.REMOVED_FROM_STAGEeventRemovedFromStage);
            
            
stage.addEventListener(MouseEvent.MOUSE_MOVEfollow);
        }
        
        private function 
eventRemovedFromStage(evt:Event) {
            
removeEventListener(Event.REMOVED_FROM_STAGEeventRemovedFromStage);
            
stage.removeEventListener(MouseEvent.MOUSE_MOVEfollow);
            
            
addEventListener(Event.ADDED_TO_STAGEeventAddToStage);
        }
        
        
        private function 
follow(evt:MouseEvent) {
            
trace("do stuff");
        }
    }

__________________
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 12-02-2012, 16:44   #5 (permalink)
Neuer User
 
Benutzerbild von zarevok
 
Registriert seit: Jun 2004
Beiträge: 51
Großen großen Dank!

Die Sache, dass die Klasse die "Arbeit" macht funktioniert nun endlich.
Ich hab nurnoch das Problem, dass die Funktion "follow" nur dann aktiv wird, wenn ich mit der Maus über dem MC bin (ist ein kleines Viereck) und nicht wenn ich irgendwo auf der stage bin.

Das heist ja dann wohl, dass die ganzen EventListener auf die stage müssen oder?
Ich probier jetzt mal mit dem "stage" rum und recherchier noch etwas, falls da noch jemand was weiss, immer her damit =D

nochmal thx!
MfG zarevok

EDIT:

Oh Danke, ich war ne Minute zu spät, genau das hab ich gemeint, jetzt geht alles!
Vielen vielen Dank!

Jetzt versuch ich noch zu verstehen warum passiert was passiert, ich wills ja nicht einfach nur blind kopieren müssen ^^

Fällt mir noch n bisschen schwierig zu verstehen, was auf stage soll und was nicht, und warum manchmal stage "gefunden" wird und manchmal nicht (Fehler von anderen Versuchen)

Geändert von zarevok (12-02-2012 um 16:47 Uhr) Grund: zu spät
zarevok ist offline   Mit Zitat antworten
Alt 12-02-2012, 16:56   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
was angezeigt werden soll gehört auf die bühne.

genau ab da (zeitlich) :
private function eventAddToStage(evt:Event) {
ist dem object stage bekannt. im konstruktor noch nicht.
und vorsicht: object in object in objekt ... irgend ein eltern muss auf stage stehen, sonst natürlich auch nicht. nur zur info, weil wenn das nicht der fall ist, dann kann es auch kein ADDED_TO_STAGE geben.

die listener gehören immer da hin, wo was passieren soll (wo die funktion ist)
z.b.
- das schicke aussehen mit rollover, rollout ist alleine sache des buttons, also private im button.
- das draufklicken, damit hat der button garnichts zu tun. das führt z.b. ein menü aus, oder es passiert in einem fenster.
- den ganzen button zu verschieben ist z.b. der job innerhalb eines schiebereglers, dann halt da.
das ein button auf der bühne rumgeschoben werden soll ist eher nicht der fall.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (12-02-2012 um 17:01 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 12-02-2012, 17:03   #7 (permalink)
Neuer User
 
Benutzerbild von zarevok
 
Registriert seit: Jun 2004
Beiträge: 51
Sagt mal stelle ich das gerade richtig fest, dass man für JEDEN EventListener in einer Klasse diese ADDED_TO_STAGE und REMOVE_FROM_STAGE Routine bringen muss?

Das klingt nämlich ziemlich aufwendig und irgendwie geht das doch bestimmt irgendwann in die Performance?

Ich werd das Gefühl nicht los, dass man alles mit EventListenern im Hauptprogramm machen sollte, oder wie seht ihr das?
zarevok ist offline   Mit Zitat antworten
Alt 12-02-2012, 17:11   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
- ein object kann nur einmal auf die bühne gebracht werden und kann natürlich viele unterschiedliche events haben. also eventAddToStage gibts pro klasse nur einmal, darin können viele listener erstellt werden. aber möglichst immer nur die, die auch gebraucht werden. und wenn nicht mehr, dann halt gleich löschen.

- es sollte eine klasse für deinen type button geben. was da drinn steht betrifft jede instanz dieses buttons.
- in z.b. einem menü mit z.b. 10 buttons brauchst du keine 10 Click-events, sondern nur eins. die events bubbeln durch die hierarchie und können gemeinsam ausgewertet werden.
da gibts viele varianten ...
Code:
// einer für alle muss natürlich auch unterscheiden
private function clickInMenu(evt:MouseEvent):void {
  switch (evt.target) {
    case button1:
      ...
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (12-02-2012 um 17:19 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 12-02-2012, 17:12   #9 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.040
Nein, du benötigst nur added to stage um auf die variable stage zuzugreifen, welche erst definiert ist, wenn du das Anzeigeobjekt auf dei Bühne gesetzt hast.

Wenn dein Anzeigeobjekt einfach nur als Mauszeigerersatz dienen soll, reicht es im Konstruktor startDrag() aufzurufen.
__________________
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 12-02-2012, 17:17   #10 (permalink)
Neuer User
 
Benutzerbild von zarevok
 
Registriert seit: Jun 2004
Beiträge: 51
Also das ganze soll nachher auf eine kleine Übungs TD hinaus laufen.

Ich will praktisch einen button machen der "Build" heist, wenn man diesen anklickt, dann soll der build_mode auf true gestellt werden, und wenn das passiert dann soll der "Tower" am Mauszeiger sticken.

Im moment passiert es außerdem, dass wenn ich das mit dem bisherigen Code mache (von euch und mir) dann springt da viereck ganz komisch hin und her, und mit Trace bekomm ich immer kurz nacheinander 2 koordinaten, evtl. liegt das daran, das in der "pause" zwischen den EventListenern es kurzzeitig wieder relativ zum MC rechnet und nichtmehr zur stage?

Also ich weiss nicht, aber so langsam glaub ich wirklich, dass ich alle umfangreicheren und "langfristigeren" EventListener auf die Hauptbühne Stelle und nur die einfachen Sachen in die Klasse schreibe.

Aber gerade bei der TD und dem Modus, wie ich das jetzt machen will, wäre es halt schon übersichtlich, wenn die Klasse komplett alles managed, aber mit dieser "verzögerung" bzw. diesem "Zwischen-sprung-Fehler" ist das etwas doof....

EDIT:
@Milchreis
Kann ich dich dann nicht einfach einmalig definieren, dass die Klasse sie kennt und den rest dann einfach nur über stage.addEventListener... machen? Oder überhaupt dann weiterhin über stage. .... alles weitere ansprechen und "erstellen"?

Geändert von zarevok (12-02-2012 um 17:18 Uhr)
zarevok 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 CS5] MouseEvent.MOUSE_DOWN && MouseEvent.MOUSE_OVER xianCS5 Flash Einsteiger 2 31-05-2011 18:11
bzgl. Klassen: variable innerhalb von Klassen übergeben/abfragen? mathiregister ActionScript 3 3 08-01-2010 07:26
Problem Klassen aufrufen aus anderen Klassen?!?!? eyeffect ActionScript 3 7 31-05-2008 17:47
MouseEvent.CLICK & MouseEvent.DOUBLE_CLICK monroe ActionScript 3 0 16-07-2007 15:33
frage zu klassen und «nicht-klassen» gaspode Flash 8 6 22-09-2005 13:25


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

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


Copyright ©1999 – 2012 Marc Thiele