2015-10-26 80 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. 檢查 '禁用鍵盤快捷鍵'

簡易修復

  • 點擊 '控制'。謝謝你的幫助。