Actionscript 3 AS3-键盘事件对某些键不起作用
所以这很奇怪,我使用的是Kongregate.com在你做“Shootorials”时提供给你的完全相同的键类。它对箭头键很有效,但当你尝试使用WASD控件时就没有那么多了。我无法让它识别键码,所以我开始键入trace();按键事件处理程序中的语句 结果是,我的箭头键和其他一些键,如“D”和“G”将触发事件。但是其他的钥匙不起作用A、S 为什么我的班级只为一些钥匙而不是其他钥匙工作 源代码 包装 {Actionscript 3 AS3-键盘事件对某些键不起作用,actionscript-3,keyboard,addeventlistener,Actionscript 3,Keyboard,Addeventlistener,所以这很奇怪,我使用的是Kongregate.com在你做“Shootorials”时提供给你的完全相同的键类。它对箭头键很有效,但当你尝试使用WASD控件时就没有那么多了。我无法让它识别键码,所以我开始键入trace();按键事件处理程序中的语句 结果是,我的箭头键和其他一些键,如“D”和“G”将触发事件。但是其他的钥匙不起作用A、S 为什么我的班级只为一些钥匙而不是其他钥匙工作 源代码 包装 { }曾经有过同样的问题。我的浏览器与我正在运行的浏览器绑定。一些浏览器似乎会突出一些键盘事件,而不
}曾经有过同样的问题。我的浏览器与我正在运行的浏览器绑定。一些浏览器似乎会突出一些键盘事件,而不会让它们在flash player上冒泡
在其他浏览器中检查相同的问题可能会给你一个解决问题的切入点。Akos说要检查浏览器是否劫持了键盘事件。经过调查,我知道是我的flash播放器本身劫持了我的钥匙。下面是我如何修复它的
容易解决。谢谢您的帮助。您的代码看起来应该可以工作。如何调用
键
类?为了运行它,我让Key extend Sprite并将其设置为flashbuilder中的应用程序文件……但是从您发布的内容来看,似乎很明显您还有其他类调用了Key.initialize(stage)是的,先生,我的文档类叫做“游戏”。在游戏构造函数中,调用Key.initialize(stage);正如你所说的。然后我有另一个类叫做“船”,这是玩家控制的电影剪辑。Ship有一个enterFrame事件侦听器,在该处理程序中,它表示if(Key.isDown(Keyboard.RIGHT)| | Key.isDown(68)){this.x+=xSpeed;}该类在所有方向上也有类似的“if”语句。它适用于箭头键,“D”键和“W”键。无论出于什么原因,它都不适用于“A”或“S”。我看不出为什么我可以用“D”键向右移动,但我不能用“A”键向左移动。是否可能有其他代码在监听这些键?或者是否同时按下了其他键?(同时按键通常是有限制的)我想你可能有什么想法。你介意详细说明一下吗?我将我的项目导出为.swf,然后使用AdobeFlashPlayer从那里运行它。别的什么都没有,所以我想知道是什么东西劫持了我的钥匙。我试着把焦点放在舞台上,但那没有改变任何事情。(不确定是否应该)据我所知,Firefox的键盘焦点特别奇怪,据我所知,Chrome应该可以很好地传递事件。我发现处理这个问题最可靠的方法是使用外部接口,让javascript传递关键代码或感兴趣的键。这有一个例子:编辑:还要注意不要两次处理相同的事件。问题是我没有在浏览器中运行我的.swf。它直接从我的笔记本电脑上取下。来自AS3参考:“另外,如果您在Flash中使用测试电影命令,创作界面可能会响应某些键,而不是附加到子精灵的事件侦听器。”
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
public class Key {
private static var initialized:Boolean = false;
private static var keysDown:Object = new Object(); // stores key codes of all keys pressed
public static function initialize(stage:Stage) {
if (!initialized) {
// assign listeners for key presses and deactivation of the player
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
stage.addEventListener(Event.DEACTIVATE, clearKeys);
// mark initialization as true so redundant
// calls do not reassign the event handlers
initialized = true;
trace("Initialized [Keys]");
}
}
public static function isDown(keyCode:uint):Boolean
{
return Boolean(keyCode in keysDown);
}
private static function keyPressed(event:KeyboardEvent):void {
trace("Keyboard Event Trigger");
keysDown[event.keyCode] = true;
}
private static function keyReleased(event:KeyboardEvent):void {
if (event.keyCode in keysDown) {
delete keysDown[event.keyCode];
}
}
private static function clearKeys(event:Event):void {
// clear all keys in keysDown since the player cannot detect keys being pressed or released when not focused
keysDown = new Object();
}
}