Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 按下键使鼠标在闪烁状态下延迟FF_Flash_Apache Flex_Actionscript 3_Firefox_Lag - Fatal编程技术网

Flash 按下键使鼠标在闪烁状态下延迟FF

Flash 按下键使鼠标在闪烁状态下延迟FF,flash,apache-flex,actionscript-3,firefox,lag,Flash,Apache Flex,Actionscript 3,Firefox,Lag,我正在努力提高我们所做的flash游戏的性能。这是一款与GTA非常相似的游戏,但适用于flash。。。这就是为什么同时使用鼠标和键盘很重要 但在Firefox(上一个flash版本和上一个Firefox版本)中,在某些情况下,如果您按下一个键(WASD)并移动鼠标,鼠标事件会在键盘事件之后显示,当您释放键盘时 我发现很多人在自己的游戏中都有同样的问题,但他们无法解决 请帮忙 编辑: 完整的代码非常大,我不知道问题出在哪里。但是我做这个类是为了做一个测试(这个类正在运行游戏: public

我正在努力提高我们所做的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]

当您为say“W”获取key down事件时,您可以将该事实保存在一个变量中,比如boolean wKeyIsDown。然后取消该事件以停止接收该事件。然后,当W为up时,将wKeyIsDown变量更改为false并再次取消该事件。您不需要经常知道发生了什么


查看您如何使用事件可能会有所帮助。您的移动逻辑可能有缺陷。

尝试使用弱引用

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

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

'dom.ipc.plugins.enabled.npswf32.dll' to false
在FF的about:config中,它解决了Firefox中鼠标和键盘的问题

但我仍然有一个问题,就是我无法从游戏用户那里改变所有Firefox。
重要的问题是用户没有延迟。

这里有一些东西需要看一下:

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
或类似的运动中使用


请告诉我这是否有帮助。

我正在运行Firefox 3.6.14,无法复制您的错误。但是我创建了一个小类,所以您可以自己测试它。它能像你想的那样工作吗?要使用它,请创建一个新项目,将该类用作主类。你应该有一个可以用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;
        }
    }

}

请发布与问题相关的代码。我们没有心灵感应,所以我们无法读懂你的心思。嗨,马特,对不起,代码太大了,可能有6万行。。。我做了一个小测试。能同时按两个键是必要的吗?有几种方法可以做到这一点。这对游戏至关重要,因为玩家必须在游戏中向任何方向移动。。。我不知道这方面的所有方法,但我们计算了用户必须从用户按下的键开始移动的方向。本周末,我可能可以深入了解这一点。无论如何,你的问题是垃圾收集。当按键未被使用或被过度使用时,您至少需要删除侦听器。您好,谢谢您的回答。如果我没有理解错你的建议,这将不允许我一次听到一个以上的按键,因为我会在收到一个按键事件后立即取消该事件。这是至关重要的游戏,玩家可以向任何方向移动。如果我错了,请纠正我。我的建议是,当您收到一个关闭事件时,将其存储在一个数组中,然后取消该按钮的当前事件。然后,当您收到一个up事件时,添加back down事件并更改数组中的值。我认为这样做的好处是,在移动代码中,您并没有检查事件的条件,而是检查您设置的变量的值。再一次,看到你的动作代码会很有帮助。Hi Veehmot谢谢你的回答。我按照你的建议做了,但结果还是一样的。我希望这能解决我的问题。弱引用只在附加到侦听器的对象被删除时起作用。这就是为什么没有效果。在游戏中我有两个部分,一个是你可以在街上行走,另一个是你不能行走,因为你在房子里。我在一个没有游戏的新项目中测试了你的建议,它很有效。当添加到游戏中时,如果我在街上散步就像往常一样有效,但在家里它非常有效!!我遇到的问题是在街上有很多汽车、人和城市。我添加了应用程序的链接:我正在检查游戏,我不知道你是否解决了它,但它对我来说工作正常。但是,如果您仍然存在此问题,并且仅在Firefox上存在此问题,我建议您在应用程序中运行探查器。你可以运行任何人,但我推荐这一个:。使用此应用程序,您应该能够发现任何未释放的内存泄漏或隐藏事件侦听器,这样您就有机会找到问题的根源。我刚刚做了您建议的此测试,但没有成功:(我将尝试在进入帧上移动