3

我正在努力提高我们所做的 Flash 游戏的性能。这是一款与 GTA 非常相似的游戏,但使用的是 flash……这就是为什么鼠标和键盘可以同时使用很重要的原因……

但是在 Firefox(使用最新的 flash 版本和最新的 Firefox 版本)中,在某些情况下,如果您按下一个键 (WASD) 并移动鼠标,那么当您释放键盘时,鼠标事件会在键盘事件之后调度。 ..

我发现很多人在自己的游戏中遇到同样的问题,但他们无法解决!

一些帮助请!

编辑:

完整的代码非常大,我找不到问题所在。但是我做了这个类来做一个测试(这个类是和游戏一起运行的:

    public function MouseAndKeyboardTest()
    {
        var stage : Stage = FW.Stage_;

        stage.addEventListener(MouseEvent.MOUSE_MOVE, MouseMove);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, KeyUp);
    }

    private function KeyUp(e : KeyboardEvent)
    {
        trace("Key Up : " + e.keyCode);
    }

    private function KeyDown(e : KeyboardEvent)
    {
        trace("Key Down : " + e.keyCode);
    }

    private function MouseMove(e : MouseEvent)
    {
        trace("Mouse Move : [" + e.stageX + ", " + e.stageY + "]"   );
    }

这是当您按下键并且鼠标同时移动时的跟踪结果,一些鼠标在两者之间移动并且在所有键都向上之后移动了很多:

        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 87
        Key Down : 65
        Key Down : 65
        Key Down : 68
        Key Up : 65
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 65
        Key Up : 68
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 65
        Key Down : 68
        Key Up : 65
        Mouse Move : [353.65, 137.55]
        Mouse Move : [354.8, 138.4]
        Mouse Move : [354.8, 137.4]
        Mouse Move : [362.8, 135.4]
        Mouse Move : [372.9, 135.25]
        Key Down : 68
        Mouse Move : [449.9, 139.25]
        Mouse Move : [462.85, 139.35]
        Key Down : 68
        Key Down : 68
        Mouse Move : [479.85, 139.35]
        Mouse Move : [477.85, 139.35]
        Mouse Move : [469.85, 141.35]
        Mouse Move : [458.95, 145.2]
        Key Down : 68
        Mouse Move : [445.95, 148.2]
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Key Down : 68
        Mouse Move : [330.65, 171.55]
        Key Down : 68
        Key Up : 87
        Key Up : 68
        Mouse Move : [210, 196.2]
        Mouse Move : [207, 198.2]
        Mouse Move : [246.2, 190]
        Mouse Move : [354.2, 180]
        Mouse Move : [431.15, 173]
        Mouse Move : [323.15, 197]
        Mouse Move : [181.15, 220]
        Mouse Move : [80.15, 231]
        Mouse Move : [267.15, 203]
        Mouse Move : [186.15, 225]
        Mouse Move : [20.15, 217]
        Mouse Move : [161.15, 217]
        Mouse Move : [132.15, 223]
4

5 回答 5

2

Firefox 3.6.4 及更高版本中的插件容器存在问题。通过改变:

'dom.ipc.plugins.enabled.npswf32.dll' to false

在 FF 的 about:config 中,它解决了 Firefox 中鼠标和键盘的问题。

但是我仍然有一个问题,即我无法在游戏用户的所有 Firefox 中更改这一点。重要的问题是用户没有滞后。

于 2011-03-04T18:51:52.087 回答
2

这里有一些值得一看的东西:

var keys:Object = {};
var keyTimer:Timer = new Timer(1000);

keyTimer.addEventListener(TimerEvent.TIMER, keyTimed, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownManager, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpManager, false, 0, true);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoved, false, 0, true);

function keyTimed(evt:TimerEvent):void
{
    keyTimer.stop();
    keyTimer.reset();
    if(stage.hasEventListener(KeyboardEvent.KEY_DOWN))
    {
        stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownManager);
    }
}

function keyDownManager(evt:KeyboardEvent):void
{
    keyTimer.start();
    switch(evt.keyCode)
    {
        case 37:
        keys['left'] = true;
        break;
        case 38:
        keys['up'] = true;
        break;
        case 39:
        keys['right'] = true;
        break;
        case 40:
        keys['down'] = true;
        break;
    }
    trace("key is down");
}

function keyUpManager(evt:KeyboardEvent):void
{
    keyTimer.stop();
    keyTimer.reset();
    switch(evt.keyCode)
    {
        case 37:
        keys['left'] = false;
        break;
        case 38:
        keys['up'] = false;
        break;
        case 39:
        keys['right'] = false;
        break;
        case 40:
        keys['down'] = false;
        break;
    }
    trace("key is up");
    if(!stage.hasEventListener(KeyboardEvent.KEY_DOWN))
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownManager, false, 0, true);
    }
}

function mouseMoved(evt:MouseEvent):void
{
    trace("mouse moved");
}

我已经1000为一个计时器指定了毫秒的范围,只要按键按下,它就会运行。这将使您能够使用多个键,但一旦任何键组合被按住1000几毫秒,就会删除侦听器。释放任何键后,将重新添加侦听器并重置计时器。这使您能够做的是控制侦听器的移除,如果有人在一组(在这种情况下为长)时间量内持有组合键。

此外,我已经实现了一个对象来存储关键布尔值,因此这些属性可以在一个ENTER_FRAME或类似的东西中用于移动。

让我知道这是否有帮助。

于 2011-03-04T19:38:47.610 回答
1

我正在运行 Firefox 3.6.14,但无法复制您的错误。但是我创建了一个小类,所以你可以自己测试它。它可以按您的意愿工作吗?要使用它,请创建一个新项目,将此类用作 Main。你应该有一个可以用 WASD 移动的对象和一个可以用鼠标移动的目标。您可以在任何方向上移动,同时使用鼠标。请发布您的结果。

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.ui.Keyboard;
    public class Main extends Sprite {
        private var keys:Array = new Array();
        private var hero:Sprite = new Sprite();
        private var aim:Sprite = new Sprite();
        public function Main():void {
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            stage.addEventListener(Event.ENTER_FRAME, update);

            // create the objects for testing
            hero.graphics.beginFill(0xff0000);
            hero.graphics.drawRect(0, 0, 50, 50);
            hero.graphics.endFill();
            hero.x = stage.stageWidth / 2;
            hero.y = stage.stageHeight / 2;
            stage.addChild(hero);

            aim.graphics.lineStyle(1, 0);
            aim.graphics.drawCircle(0, 0, 10);
            aim.graphics.moveTo(0, -10);
            aim.graphics.lineTo(0, 10);
            aim.graphics.moveTo(-10, 0);
            aim.graphics.lineTo(10, 0);
            aim.x = hero.x + hero.width / 2;
            aim.y = hero.y + hero.height / 2;
            stage.addChild(aim);
        }

        private function update(e:Event):void {
            if (keys[65]) hero.x -= 5;
            if (keys[68]) hero.x += 5;
            if (keys[87]) hero.y -= 5;
            if (keys[83]) hero.y += 5;
        }

        private function onMouseMove(e:MouseEvent):void {
            aim.x = e.stageX;
            aim.y = e.stageY;
        }
        private function onKeyDown(e:KeyboardEvent):void {
            keys[e.keyCode] = true;
        }
        private function onKeyUp(e:KeyboardEvent):void {
            keys[e.keyCode] = false;
        }
    }

}
于 2011-03-04T22:45:22.527 回答
0

当您获得“W”的按键按下事件时,您可以将该事实保存在变量中,例如布尔值 wKeyIsDown。然后取消事件以停止接收事件。然后当 w 启动时,将您的 wKeyIsDown 变量更改为 false 并再次取消事件。你不需要经常知道发生的事情。

了解您如何使用这些事件可能会有所帮助。你的动作逻辑可能有缺陷。

于 2011-03-03T23:58:22.100 回答
0

尝试使用弱引用。

addEventListener(KeyboardEvent.MOUSE_MOVE, MouseMove, false, 0, true):
addEventListener(KeyboardEvent.KEY_UP, KeyUp, false, 0, true):
addEventListener(KeyboardEvent.KEY_DOWN, KeyDown, false, 0, true):

请注意,关于弱引用的最后一个参数必须设置为 true。

ps: bienvenido 一个 stackoverflow ;)

于 2011-03-04T01:11:56.367 回答