2016-10-15 11 views
1

Ich habe einige Tests bezüglich der MouseEvents durchgeführt. Dank Neal Davis wurde das meiste für mich geklärt. Jetzt möchte ich Codes so gestalten, dass, wenn ich klicke, es beginnt, Kreise entlang der x- und y-Koordinaten der Maus zu zeichnen. Wenn ich die linke Maustaste loslasse, hört es auf, Kreise zu zeichnen. Ich habe versucht, diese so weit wie möglich zu replizieren, aber das ist, wo ich schließlich fest:Können wir MouseEvents deaktivieren?

stage.addEventListener(MouseEvent.MOUSE_DOWN, mClickOn); 
stage.addEventListener(MouseEvent.MOUSE_MOVE, mMove); 
stage.addEventListener(MouseEvent.CLICK, mClickOff); 

public var clickOn:Boolean; 
public var clickOff:Boolean; 

public function mClickOn(e:MouseEvent):void 
{ 
    clickOn = e.buttonDown; 
} 

public function mClickOff(e:MouseEvent):void 
{ 
    clickOff = e.buttonDown 
} 

public function mMove(e:MouseEvent):void 
{ 
    if (clickOn) //keep drawing when left click 
    { 
     draw.create(e.localX, e.localY); 
     addChild(draw); 
    } 
    else if (clickOff) //don't draw when you let go of left click 
    { 
     null; 
    } 
} 

Das Problem ist, dass MOUSE_DOWN wahr ist, wenn darauf geklickt links, aber ich davon aus, dass, wenn wir zu klicken, nicht mehr verlassen, ist es ll wird automatisch zu false zurückkehren. Zu meinen Tests bleibt es nach dem ersten Klick wahr. Was CLICK betrifft, ist es immer falsch.

Wie mache ich es so, dass diese MouseEvents ein- und ausgeschaltet werden können? Ich möchte ein Bleistiftwerkzeug/Simulator machen.

+0

Bitte überprüfen Sie das API-Referenzmaterial, das ich bei Ihrer letzten Frage gepostet habe. Es gibt wirklich eine Menge guter Sachen darin, dass es aussieht, als hättest du nicht gelesen. –

+0

Ihr else if/null Block ist sinnlos. Alle if-Blöcke haben das impliziert. Wenn X dann y * wenn nichts tun * –

Antwort

1

Hier ist die Idee:

  1. Wenn die Maustaste geht nach unten, ein Flag zu wahr, und es auf false gesetzt, wenn die Maus nach oben geht.
  2. Überprüfen Sie den Wert dieses Flags für jede Anwendungsschleife (entweder ein Zeitgeberereignis oder ein Rahmenereignis)
  3. Beginnen Sie mit der Auswahl von MOUSE_DOWN, wenn das Werkzeug "Kreise zeichnen" ausgewählt ist.
  4. Hören Sie auf MOUSE_DOWN zu hören, wenn die Maus nicht mehr reagiert und auf MOUSE_UP wartet
  5. Wenn die Maus nach oben geht, hören Sie erneut auf MOUSE_DOWN und hören Sie auf, auf MOUSE_UP zu hören.
  6. hören Sie dann auf, auf MOUSE_DOWN zu hören, wenn das Werkzeug ausgewählt ist. (I zeigen nicht die Werkzeug Wahl und Abwahl Teil unten Hoffentlich erhalten Sie die Idee allerdings für jedes Werkzeug, müssen Sie diesen Prozess replizieren..)

Tun Sie etwas wie folgt aus:

private function mDown(me:MouseEvent):void{ 
    _mDown = true; 
    stage.removeEventListener(MouseEvent.MOUSE_DOWN, mDown); 
    stage.addEventListener(MouseEvent.MOUSE_UP, mUp); 
} 

private function mUp(me:MouseEvent):void{ 
    _mDown = false; 
    stage.removeEventListener(MouseEvent.MOUSE_UP, mUp); 
    stage.addEventListener(MouseEvent.MOUSE_DOWN,mDown); 
} 

und dann werden Sie eine appTick oder gameLoop oder timerevent wie

stage.addEventListener(Event.ENTER_FRAME, applicationLoop); 

private function applicationLoop(e:Event):void{ 
    if (_mDown == true){ 
     drawCircles(); 
    } 

und dann brauchen

private function drawCircles():void{ 
    // your draw logic 
} 

Das sollte es tun.

HINWEIS wenn Sie wollen Kreise, wie ein Sprühfarbe Werkzeug arbeitet zeichnen (hält noch mehr Farbe hinzugefügt, wenn die Maus nicht bewegt), um jeden Rahmen die _mDown Flagge überprüfen. Wenn Sie möchten, dass nur Kreise hinzugefügt werden, während sich die Maus bewegt, überprüfen Sie stattdessen das Flag für ein MOUSE_MOVE-Ereignis.

+0

Awesome! Das hat perfekt funktioniert. Danke nochmal Neal Davis! – Zulu

+0

Sie wetten. Froh, dass es für dich funktioniert hat. Stellen Sie sicher, diese API-Dokumente zu überprüfen;) –

0

Ein Klick drückt die Maustaste und lässt los. Dies ist für Ihre Situation nicht nützlich, da Sie die Maus einzeln nach unten und nach oben betrachten möchten, um den Zeichenprozess zu starten oder zu stoppen. Die Verwendung von MouseEvent.MOUSE_DOWN und MouseEvent.MOUSE_UP ist hier angemessener.

Um den Prozess zu starten und zu stoppen, fügen Sie einfach den Listener hinzu oder entfernen Sie den Listener, um zwischen den beiden Zeichenzuständen umzuschalten und nicht zu zeichnen.

stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); 

public function onMouseDown(e:MouseEvent):void 
{ 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); 
    stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); 

    stage.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); 
} 

public function onMouseUp(e:MouseEvent):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); 

    stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); 
} 

public function onMouseMove(e:MouseEvent):void 
{ 
    draw.create(e.localX, e.localY); 
    addChild(draw); 
} 
+0

Danke! Ich habe diesen Code auch ausprobiert! Zu meinen Notizen hinzugefügt – Zulu

Verwandte Themen