2014-12-29 56 views
-1

我正在寫一個小型的自上而下的遊戲,玩家在箭頭鍵控制的二維數組中移動。
我一定看過每一個關於鍵綁定的教程,但是我無法讓我的鍵綁定更新主'樓層'對象。幫幫我!對不起,文本牆,但我認爲這三個文件的上下文是有幫助的。謝謝!爪哇鑰匙綁定和箭頭鍵

編輯:SSCCE

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package palace.hero; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class SSCCE 
{ 
    public static void main(String[] args) 
    {  
     JPanel gridPanel = new JPanel(); 

     int xCoord = 0; 
     int yCoord = 0; 

     //Key Bindings   
     gridPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "up"); 
     gridPanel.getActionMap().put("up", new SSCCEKA(xCoord, yCoord, "up")); 
     gridPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0), "down"); 
     gridPanel.getActionMap().put("down", new SSCCEKA(xCoord, yCoord, "down")); 
     gridPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "left"); 
     gridPanel.getActionMap().put("left", new SSCCEKA(xCoord, yCoord, "left")); 
     gridPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0), "right"); 
     gridPanel.getActionMap().put("right", new SSCCEKA(xCoord, yCoord, "right")); 

     //Window 
     JFrame window = new JFrame("Window"); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     int windowHeight = 1125; 
     int windowWidth = 900; 
     window.setPreferredSize(new Dimension(windowHeight, windowWidth)); 

     window.add(gridPanel); 
     window.pack(); 
     window.setVisible(true); 

     gridPanel.requestFocusInWindow(); 
    } 
} 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package palace.hero; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class SSCCEKA extends AbstractAction 
{ 
    String direction; 
    int x = 0; 
    int y = 0; 

    public SSCCEKA(int x, int y, String direction) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) 
    { 
     if(direction.toLowerCase().equals("up")) 
     { 
      x++; 
     } 
     if(direction.toLowerCase().equals("down")) 
     { 
      x--; 
     } 
     if(direction.toLowerCase().equals("left")) 
     { 
      y--; 
     } 
     if(direction.toLowerCase().equals("right")) 
     { 
      y++; 
     } 
    } 
} 
+0

是否檢測不到按鍵或其他問題? (如果是這樣,構建一個[SSCCE](http://sscce.org)應該是微不足道的。) – aioobe

+0

不,它們被檢測到,我只是不知道如何給AbstractAction的'actionPreformed'函數副作用。 (我已經將它用於打印「向上,向下,向左,向右」,但是我希望它實際上改變了主要類中的地板對象......) – Haskelier

+0

如果你能解決你的問題會很有幫助...請參閱[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve) – Chrismas007

回答

3

當您創建任何複雜到一個遊戲,你應該使用model/view/controller pattern

所以,我們來創建一個模型類。

public class GameModel { 

    private int xCoordinate; 
    private int yCoordinate; 

    public int getxCoordinate() { 
     return xCoordinate; 
    } 

    public void setxCoordinate(int xCoordinate) { 
     this.xCoordinate = xCoordinate; 
    } 

    public int getyCoordinate() { 
     return yCoordinate; 
    } 

    public void setyCoordinate(int yCoordinate) { 
     this.yCoordinate = yCoordinate; 
    } 

} 

你可以通過構造函數傳遞GameModel類的SSCCEKA類。

請記住,只有控制器類可能會修改遊戲模型。

+0

對不起新手問題,但每次按下按鈕時如何調用構造函數? (我真正要問的是如何讓actionPressed函數編輯gameModel?) – Haskelier

+0

@Haskelier:我假設你在談論GameModel的構造函數。您可以在GUI構造函數的開頭某處調用它,並將該實例傳遞給SSCCEKA類,以便actionPressed方法可以訪問GameModel實例。這裏是一個[Dice Game](http://java-articles.info/articles/?p=460)我寫的是一個模型/視圖/控制器模式。 –

+0

它的工作!萬分感謝。我只需要在KeyAction類中創建一個Gamemodel實例。 – Haskelier