Flash 按下键使鼠标在闪烁状态下延迟FF
我正在努力提高我们所做的flash游戏的性能。这是一款与GTA非常相似的游戏,但适用于flash。。。这就是为什么同时使用鼠标和键盘很重要 但在Firefox(上一个flash版本和上一个Firefox版本)中,在某些情况下,如果您按下一个键(WASD)并移动鼠标,鼠标事件会在键盘事件之后显示,当您释放键盘时 我发现很多人在自己的游戏中都有同样的问题,但他们无法解决 请帮忙 编辑: 完整的代码非常大,我不知道问题出在哪里。但是我做这个类是为了做一个测试(这个类正在运行游戏:Flash 按下键使鼠标在闪烁状态下延迟FF,flash,apache-flex,actionscript-3,firefox,lag,Flash,Apache Flex,Actionscript 3,Firefox,Lag,我正在努力提高我们所做的flash游戏的性能。这是一款与GTA非常相似的游戏,但适用于flash。。。这就是为什么同时使用鼠标和键盘很重要 但在Firefox(上一个flash版本和上一个Firefox版本)中,在某些情况下,如果您按下一个键(WASD)并移动鼠标,鼠标事件会在键盘事件之后显示,当您释放键盘时 我发现很多人在自己的游戏中都有同样的问题,但他们无法解决 请帮忙 编辑: 完整的代码非常大,我不知道问题出在哪里。但是我做这个类是为了做一个测试(这个类正在运行游戏: public
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上存在此问题,我建议您在应用程序中运行探查器。你可以运行任何人,但我推荐这一个:。使用此应用程序,您应该能够发现任何未释放的内存泄漏或隐藏事件侦听器,这样您就有机会找到问题的根源。我刚刚做了您建议的此测试,但没有成功:(我将尝试在进入帧上移动