簡體   English   中英

Java Swing Keylistener 2D Boulderdash

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM