2017-09-20 5 views
4

Je fais un jeu en utilisant Haxe + OpenFL. J'avais ciblé il y a une fois js, puis je suis passé à Neko et la construction suivante cessé de travailler:Haxe + OpenFL-> Neko, MouseEvent.xxxKey toujours faux

if(e.shiftKey) 
    do smth 

Ofc Je n'ai pas changé ce bloc de code, ni contexte depuis changement de la cible. Qu'est-ce qui a mal tourné?

P. S. Tracing montre, que la tenue alt, ctrl ou les touches Maj, ne pas modifier les propriétés correspondantes de l'objet MouseEvent

Répondre

2

Basé sur this link, il l'habitude d'être un problème, mais a été fixé il y a deux ans. Bizarrement, mes tests montrent que ça ne marche toujours pas.

Cette classe montre qu'elle fonctionnera correctement dans js mais pas dans 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); 
    } 

} 

Une autre solution pourrait être d'utiliser openfl.events.KeyboardEvent et notez lorsque la touche Maj enfoncée vers le haut ou vers le bas est un booléen (notez le code d'activation de ce changement est de 16). Cet exemple fonctionne correctement dans mes tests.

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!'); 
     } 
    } 

} 

Mise à jour

Depuis que je l'ai toujours utilisé l'astuce événement du clavier je l'ai mentionné plus tôt, je manqué le fait que cela ne fonctionne pas non plus en C++. Je suppose que ces deux cibles utilisent un système d'événements personnalisé et que quelqu'un a oublié d'enregistrer les clés de modification dans l'événement créé.

Mise à jour 2 (septembre 22)

Someone fixed it

+2

"Mise à jour 2 (22 septembre) Quelqu'un fixé il" Heh, ce qui est bon. Mais je ne pense pas que je pourrais installer cette branche, donc je vais utiliser votre truc – Gulvan

+2

Ceci est corrigé dans la dernière version :) –

+0

Malheureusement, je ne peux pas l'utiliser dans mon projet actuel en raison de swflib, qui tire vers le bas haxe version – Gulvan