按住 AS3 键防止鼠标更新

Posted

技术标签:

【中文标题】按住 AS3 键防止鼠标更新【英文标题】:AS3 Key held down preventing mouse update 【发布时间】:2013-10-08 02:06:21 【问题描述】:

我正在开发一个 3D 游戏,当我按住移动键时,我注意到一些奇怪的行为;游戏似乎暂时忽略了鼠标位置并停止更新玩家面对的方向。游戏不会死机 - 就好像它不再注意鼠标的位置一样。

这是我用来获取按键和释放的代码:

public function keyPressed(e:KeyboardEvent):void 
    switch (e.keyCode) 
                case 32:
                        _keySpace = true;
                        break;
                case 81:
                        if (!keyQ) 
                            keyQ=true;
                        
                        break;
                case 69:
                        if (!keyE) 
                            keyE=true;
                        
                        break;
                case 65:
                        if (!keyA) 
                            keyA=true;
                        
                        break;
                case 68:
                        if (!keyD) 
                            keyD=true;
                        
                        break;

                case 87:
                        if (!keyW) 
                            keyW=true;
                        
                        break;
                case 83:
                        if (!keyS) 
                            keyS=true;
                        
                        break;
    



public function keyLift(e:KeyboardEvent):void 
            if (e.keyCode==32) 
                _keySpace = false;
             else if (e.keyCode==81) 
                keyQ=false;
             else if (e.keyCode==69) 
                keyE=false;
             else if (e.keyCode==65) 
                keyA=false;
             else if (e.keyCode==68) 
                keyD=false;
             else if (e.keyCode==87) 
                keyW=false;
             else if (e.keyCode==83) 
                keyS=false;
            
        

而更新鼠标位置的代码只是一个 ENTER_FRAME 事件:

addEventListener(Event.ENTER_FRAME, enterFrame);

...触发主游戏循环。这是使用鼠标位置的相关部分。 mouseX 和 mouseY 属性在 Player 中用于向左/向右和向上/向下旋转视图。

private function enterFrame(e:Event=null):void 
    _player.update(mouseX, mouseY);

所有这些都很好——只是按住扫射键的问题;就好像,一旦按键开始重复,游戏就会花费所有时间来解决这些事件并且忽略更新旋转 - 即使它不依赖于 MouseEvent。

有谁知道如何让 Flash 在按住键时忽略重复键?还是有其他问题? 干杯。

【问题讨论】:

我注意到的另一件事是,它在从 Flash 测试时只有上述问题;当嵌入在 html 中运行时,它很好。所以我会检查下面 micapam 的答案是否有效(如果有效,请勾选它)但我想,否则,这不是一个大问题 - 只是对测试阶段有轻微刺激。 实际上,我注意到这发生在 html 嵌入版本中。有人对如何防止每次触发 KeyboardEvent 有任何提示吗?我不是在谈论改变处理程序。我想防止按住键重复触发事件开始。有其他人在他们的项目中注意到这一点吗? 我不确定这是否可行,但我想我会给这个问题一个“碰撞”。我仍然有按住键来防止鼠标更新(并忽略鼠标点击) - 但它似乎只有在按键被按住足够长的时间以自动重复时才会发生。有什么方法可以防止键在 Flash 中自动重复?如果可能的话,我真的很想防止触发不必要的事件。 【参考方案1】:

您可以检查您的密钥处理程序上次触发的时间,如果它比某个阈值更近,请忽略它。你可以做到十分之一秒:

private static const KEY_THRESHOLD:int = 100; // 100 ms = 1/10 second

private static var lastPressedAt:int;

public function keyPressed(e:KeyboardEvent):void 
    var now:int = new Date().getTime();

    if (lastPressedAt > 0 && now - lastPressedAt < KEY_THRESHOLD) 
        return;
    

    lastPressedAt = now;

    // etc...

【讨论】:

我按原样尝试了这个,但它不起作用(int 不能为空);我也尝试了它的几种变体(使用“未定义”或将 lastPressedAt 更改为数字 - getTime() 返回的类型) - 都没有成功。还有更多提示吗?

以上是关于按住 AS3 键防止鼠标更新的主要内容,如果未能解决你的问题,请参考以下文章

如何防止鼠标右键单击onMouseDown()反应js?

as3 AIR Win- 在全屏窗口中防止 ALT+空格键

AS3 创建一个圆圈并通过按住鼠标来扩展它

防止鼠标中键默认行为是 android 应用程序中的转到主页行为

在鼠标单击期间防止键盘事件(未释放)

防止在 Safari 浏览器中单击鼠标右键