【问题标题】:Haxe+OpenFL->Neko, MouseEvent.xxxKey always falseHaxe+OpenFL->Neko, MouseEvent.xxxKey 总是假的
【发布时间】:2017-09-20 17:14:18
【问题描述】:

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

if(e.shiftKey)
  do smth

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

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

【问题讨论】:

    标签: mouseevent haxe shift openfl neko


    【解决方案1】:

    基于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 键何时向上或向下作为布尔值(注意 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

    【讨论】:

    • “更新 2(9 月 22 日)有人修复了它”呵呵,很好。但我不认为我可以安装这个分支,所以我就用你的把戏
    • 这已在最新版本中修复 :)
    • 很遗憾我不能在我当前的项目中使用它,因为 swflib 会拉低 haxe 版本
    • 然后使用键盘事件来跟踪修饰键状态
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多