[英]java swing keylistener 2d boulderdash
我正在尋找一個難題,但首先,我只是想讓玩家移動,他被允許移動到不是岩石(1)或牆壁(0)的任何空間。
我的上,下動作很好,但是上,下動作都搞砸了,即使只按了一次鍵,它們也移動了多個空格。 如果有幫助,請使用以下可視化文件,我發布了所有相關代碼,但我猜該錯誤在“按鍵監聽器”部分中
這是我在另一個網站http://textuploader.com/13k1上載的代碼
我花了幾分鍾試圖將代碼復制粘貼到此處,但是代碼功能但並非所有代碼都被歸類為代碼,因此我無法提交它
這是其他相關類和文件的鏈接
首先,永遠不要使用數字常量而不是字段常量,
public void keyPressed(KeyEvent k) {
int keyCode = k.getKeyCode();
if(keyCode == KeyEvent.VK_R) // not keyCode == 82
}
更好的方法是使用InputMap和ActionMap,我認為它們也稱為“鍵綁定”(由MadProgrammer建議)。 輸入映射將擊鍵映射到動作名稱,而動作映射將動作名稱映射到您要執行的動作。
替換您的行(以及整個KeyListener擴展類)
this.addKeyListener(new MyKeyListener());
用類似的東西
this.getInputMap().put(KeyStroke.getKeyStroke("control L"), "link");
需要參考KeyStroke.getKeyStroke
的文檔以根據需要修改指定的擊鍵。 在我的示例中,“鏈接”是按下CTRL + L時要執行的操作的名稱。 現在我們需要指定“鏈接是什么”
this.getActionMap().put("link", new LinkAction());
其中,LinkAction是我的類,擴展了AbstractAction
,在您的情況下,其中應包括您的方法,例如levelReaderObject.setCurrentLevel(presentLevel);
。
請注意,您不需要為每個鍵都創建一個動作。 對於運動(上,下,左,右),我將所有運動按鈕綁定到不同的動作名稱(“上移”等),但是然后將所有動作名稱映射到同一動作,並讓該動作中的方法做工作:
this.getActionMap().put("move up", new MoveAction(0));
this.getActionMap().put("move down", new MoveAction(1));
this.getActionMap().put("move right", new MoveAction(2));
this.getActionMap().put("move left", new MoveAction(3));
同
class MoveAction extends AbstractAction {
int direction;
public MoveAction (int direction) {
this.direction = direction;
}
@Override
public void actionPerformed(ActionEvent e) {
switch(direction) // perform the action according to the direction
}
}
請注意,我建議將移動動作分組在一起是一個設計決定,您應該自己決定如何構造綁定(您可以對所有動作使用一個動作,或者對每個動作使用一個動作)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.