2015-10-26 131 views
-1

所以这很奇怪,我使用Kongregate.com在做他们的“Shootorials”时给你的完全相同的Key类。它适用于箭头键,但在尝试使用WASD控件时并不那么重要。我无法识别keyCode,所以我开始输入trace();在keyPressed事件处理程序中的语句。AS3 - 键盘事件不适用于某些键

事实证明,我的箭头键以及其他一些按键(如“D”和“G”)会触发事件。但其他键不起作用。 'A','S'。

为什么我的班级为某些键而不是其他键工作?

源代码

包 {

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

}

+0

你的代码看起来应该可以工作。你怎么调用你的Key类?为了运行它,我将Key扩展为Sprite,并将其设置为Flash Builder中的应用程序文件...但是从您发布的内容来看,似乎很清楚您还有其他一些类调用了'Key.initialize(stage);'。 – Brian

+0

是的,先生,我的文档类被称为'游戏'。在Game构造函数中,它调用Key.initialize(stage);正如你所说。 – Nate

+0

然后我有另一个叫做'Ship'的类,这是玩家控制的MovieClip。 Ship有一个enterFrame事件监听器,并且在这个处理器中,它说if(Key.isDown(Keyboard.RIGHT)|| Key.isDown(68)){this.x + = xSpeed;}这个类有类似的'if'语句所有方向也是如此。它适用于箭头键,它也适用于'D'键和'W'键。无论出于何种原因,它不适用于'A'或'S'。我看不出为什么我可以用'D'键移动到右边,但是我不能用'A'键移动到左边。 – Nate

回答

0

确实有同样的问题一次。我被绑在我正在运行的浏览器上。某些浏览器似乎高举一些键盘事件,不要让它们冒泡到Flash播放器。

在其他浏览器中检查相同的问题可能会为您提供解决问题的切入点。

+0

我认为你可能会做些什么。你介意阐述吗?我将我的项目导出为.swf,并使用Adobe Flash Player从此处运行。没有别的东西是开放的,所以我想知道什么可以劫持我的钥匙。我试图把重点放在舞台上,但这甚至没有改变任何东西。 (不知道是否应该这样) – Nate

+0

从我所知道的情况来看,Firefox对于键盘焦点来说尤其怪异,从我所知的Chrome浏览器中,应该可以很好地传递事件。我发现处理问题的最可靠的方法是使用外部接口并让JavaScript传递关键代码或关键字。这有一个例子: http:// stackoverflow。com/questions/683486/javascript-to-actionscript-keypress-passing-utility 编辑:另外注意不要处理相同的事件两次。 –

+0

问题是我没有在浏览器中运行我的.swf文件。它离我的笔记本电脑很近。 – Nate

0

Akos说要检查浏览器是否劫持键盘事件。经过调查,我了解到,这是我的闪存播放器本身,劫持我的钥匙。这是我如何修复它。

  1. 在你想要的任何flash播放器中运行.swf。在窗口菜单
  2. 检查 '禁用键盘快捷键'

简易修复

  • 点击 '控制'。谢谢你的帮助。