| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Neuer User 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");
}
}
} Code: var bt1:button = new button(); bt1.x = 250; bt1.y = 200; addChild(bt1); 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. 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 |
| | |
| | #2 (permalink) |
| Neuer User 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);
});
} Code: bt1.follow(); Aber wie gesagt ich weiss nicht wie ich zwischen der Hauptdatei und den Klassen herumspringen kann. |
| | |
| | #3 (permalink) |
| Techniker 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");
}
}
} - 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) |
| | |
| | #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:
__________________ 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 |
| | |
| | #5 (permalink) |
| Neuer User 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 |
| | |
| | #6 (permalink) |
| Techniker 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) |
| | |
| | #7 (permalink) |
| Neuer User 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? |
| | |
| | #8 (permalink) |
| Techniker 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) |
| | |
| | #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 |
| | |
| | #10 (permalink) |
| Neuer User 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) |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |
Ä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 |