2017-09-20 3 views
4

Ich mache ein Spiel mit Haxe + OpenFL. Ich hatte vor js einmal gezielt, dann wechselte ich neko und die folgenden Konstruktion aufgehört zu arbeiten:Haxe + OpenFL-> Neko, MouseEvent.xxxKey immer falsch

if(e.shiftKey) 
    do smth 

Ofc ich diesen Codeblock geändert habe, noch Kontext, da das Ziel zu ändern. Was ist schief gelaufen?

P. S. Tracing zeigt, dass Halte alt, ctrl oder Shift-Tasten ändern sich nicht entsprechenden Eigenschaften des Mouseevent-Objekts

Antwort

2

Basierend auf this link, verwendet es ein Problem zu sein, wurde aber vor zwei Jahren festgelegt. Seltsamerweise zeigen meine Tests, dass es immer noch nicht funktioniert.

Diese Klasse demonstriert, dass sie in js korrekt funktioniert, aber nicht in neko.

class Main extends Sprite 
{ 

    public function new() 
    { 
     super(); 

     var s:Sprite = new Sprite(); 
     s.graphics.beginFill(0xff0000); 
     s.graphics.drawCircle(100, 100, 200); 
     s.graphics.endFill(); 
     addChild(s); 

     //testing a simple click event 
     s.addEventListener(MouseEvent.CLICK, OnClick); 

     //testing wheel events, as I read somewhere it could a been a bug in earlier versions 
     s.addEventListener(MouseEvent.MOUSE_WHEEL, OnWheel); 

     //testing click events on the stage object, in case it acted differently 
     addEventListener(MouseEvent.CLICK, OnStageClick); 
    } 

    private function OnStageClick(e:MouseEvent):Void 
    { 
     trace(e.shiftKey); 
    } 

    private function OnWheel(e:MouseEvent):Void 
    { 
     trace(e.shiftKey); 
    } 

    private function OnClick(e:MouseEvent):Void 
    { 
     trace(e.shiftKey); 
    } 

} 

Eine alternative Lösung openfl.events.KeyboardEvent und beachten Sie zu verwenden, wenn die Shift-Taste als boolean (beachten Sie, dass Verschiebung des keycode ist 16) nach oben oder unten sein könnte. Dieses Beispiel funktioniert in meinen Tests korrekt.

class Main extends Sprite 
{ 
    var shiftIsPressed:Bool = false; 
    public function new() 
    { 
     super(); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, OnDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP, OnUp); 
     stage.addEventListener(MouseEvent.CLICK, OnClick); 

    } 

    private function OnUp(e:KeyboardEvent):Void 
    { 
     if (e.keyCode == 16) 
     { 
      shiftIsPressed = false; 
     } 
    } 

    private function OnDown(e:KeyboardEvent):Void 
    { 
     if (e.keyCode == 16) 
     { 
      shiftIsPressed = true; 
     } 

    } 

    private function OnClick(e:MouseEvent):Void 
    { 
     if (shiftIsPressed) 
     { 
      trace('Click!'); 
     } 
    } 

} 

aktualisieren

Da ich immer das Tastaturereignis Trick benutzt habe ich bereits erwähnt, vermisste ich die Tatsache, dass es auch nicht in C++ funktioniert. Ich nehme an, dass diese beiden Ziele ein benutzerdefiniertes Ereignissystem verwenden und jemand vergessen hat, die Änderungsschlüssel für das erzeugte Ereignis zu registrieren.

Update 2 (sept 22)

Someone fixed it

+2

Heh "Update 2 (22. September) Jemand es fest", das ist gut. Aber ich glaube nicht, dass ich diesen Zweig installieren könnte, also benutze ich einfach deinen Trick – Gulvan

+2

Dies ist in der neuesten Version behoben :) –

+0

Leider kann ich es nicht in meinem aktuellen Projekt verwenden, weil swflib, zieht haxe Version – Gulvan