Клавиша внизу мыши в Flash с FF - PullRequest
3 голосов
/ 01 марта 2011

Я пытаюсь улучшить производительность флеш игры, которую мы сделали. Это игра, очень похожая на 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]

Ответы [ 5 ]

2 голосов
/ 04 марта 2011

Вот на что посмотреть:

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 или что-то подобное для движения.

Дайте мне знать, поможет ли это вообще.

2 голосов
/ 04 марта 2011

Проблема с плагином-контейнером в Firefox 3.6.4 и выше. Изменяя:

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

в about: config из FF это решило проблему с мышью и клавиатурой в Firefox.

Но у меня все еще есть проблема, которую я не могу изменить во всех Firefox от пользователей игры. Важный вопрос заключается в том, что у пользователя нет лагов.

1 голос
/ 05 марта 2011

Я использую 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;
        }
    }

}
0 голосов
/ 04 марта 2011

Попробуйте использовать слабые ссылки.

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 a stackoverflow;)

0 голосов
/ 04 марта 2011

Когда вы получаете событие нажатия клавиши, скажем, 'W', вы можете сохранить этот факт в переменной, скажем, boolean wKeyIsDown.Затем отмените событие, чтобы прекратить его получение.Затем, когда w повысится, измените переменную wKeyIsDown на false и снова отмените событие.Вам не нужно постоянно знать о происшествии.

Может быть полезно увидеть, как вы используете события.Ваша логика движения может быть ошибочной.

...