0

我正在开发一个 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 在按住键时忽略重复键?还是有其他问题?
干杯。

4

1 回答 1

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...
于 2013-10-02T07:09:42.703 回答