3

私たちが行ったフラッシュゲームのパフォーマンスを改善しようとしています。これは、GTA に非常に似たゲームですが、フラッシュ用です...これが、マウスとキーボードを同時に使用できることが重要である理由です...

しかし、Firefox (最新のフラッシュ バージョンと最新の 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

ここで見てみましょう:

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 に答える
2

Firefox 3.6.4 以降の Plugin-container には問題があります。変更することにより:

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

FF の about:config で、Firefox のマウスとキーボードの問題を解決しました。

しかし、ゲーム ユーザーからは、すべての Firefox でそれを変更できないという問題がまだありました。重要な問題は、ユーザーにラグがないことです。

于 2011-03-04T18:51:52.087 に答える
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: スタック オーバーフローを参照してください ;)

于 2011-03-04T01:11:56.367 に答える