我正在使用 Haxe+OpenFL 制作游戏。我以前曾经针对 js,然后我切换到 neko 并且以下构造停止工作:

if(e.shiftKey)
  do smth

Ofc 自从更改目标后,我没有更改此代码块,也没有更改上下文。出了什么问题?

P. S. Tracing 显示,按住 alt、ctrl 或 shift 键不会改变 MouseEvent 对象的相应属性

最佳答案

基于 this link ,它曾经是一个问题,但已在两年前修复。奇怪的是,我的测试表明它仍然不起作用。

这个类表明它可以在 js 中正常工作,但不能在 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);
    }

}

另一种解决方案可能是使用 openfl.events.KeyboardEvent 并注意 shift 键何时向上或向下作为 bool 值(注意 shift 的键码为 16)。这个例子在我的测试中正常工作。
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!');
        }
    }

}

更新

由于我一直使用前面提到的键盘事件技巧,我错过了它在 C++ 中也不起作用的事实。我想这两个目标使用一些自定义事件系统,有人忘记将修饰键注册到创建的事件。

更新 2(9 月 22 日)

Someone fixed it

关于mouseevent - Haxe+OpenFL->Neko,MouseEvent.xxxKey 始终为 false,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46328096/

10-10 13:11