2015-11-24 139 views
1

我剛剛開始學習如何使用keyBindings,並且我無法找到我做錯了什麼,因爲當我按下我的鍵盤上的向上箭頭時,它什麼也不做。我的KeyBindings不起作用,我想知道爲什麼

我的主要遊戲窗口

public class GameWindow extends JFrame{ 

private static final long serialVersionUID = 1L; 

public int WIDTH = 160, HEIGHT = WIDTH/12 *9, SCALE = 3; 

public boolean running = false; 

BackGround bg = new BackGround(); 

Ranger R = new Ranger(); 

TimerClass T = new TimerClass(); 

public static void main(String[] args) { 
    new GameWindow(); 

} 

public GameWindow() { 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(WIDTH * SCALE, HEIGHT * SCALE); 
    setResizable(false); 

    running = true; 

    add(bg); 
    bg.add(R); 

    bg.setFocusable(true); 

    R.setFocusable(true); 

    setFocusable(true); 
    setVisible(true); 
    bg.repaint(); 

    run(); 
} 

public void run() { 
    while (running) { 
     render(); 
    } 
} 

public void render() { 
    bg.setLocation(Ranger.bgX, Ranger.bgY); 
    R.setLocation(Ranger.X, Ranger.Y); 
    R.setIcon(Ranger.rangerA[Ranger.I]); 
    R.repaint(); 
    bg.repaint(); 
} 

} 

和我的遊俠類

public class Ranger extends JLabel { 

private static final long serialVersionUID = 1L; 

public static int X, Y, dX, dY, bgX, bgY, I = 0, jumpTime = 100; 

public static boolean moving = false, movingLeft = false, 
     movingRight = false, onFloor = false, jumping = false, 
     movingUp = false, movingDown = false; 

public int totalImages = 6; 

public BufferedImage ranger1, ranger2, ranger3, ranger4, ranger5, ranger6; 

public static ImageIcon[] rangerA; 

static TileMap TileMap = new TileMap(); 

public Ranger() { 

    try { 
     // not moving 
     ranger1 = ImageIO.read(getClass().getResource(
       "/Images/Sprites/ranger/Ranger0.png")); 
     ranger2 = ImageIO.read(getClass().getResource(
       "/Images/Sprites/ranger/Ranger1.png")); 
     // moving Left 
     ranger3 = ImageIO.read(getClass().getResource(
       "/Images/Sprites/ranger/Ranger2.png")); 
     ranger4 = ImageIO.read(getClass().getResource(
       "/Images/Sprites/ranger/Ranger3.png")); 
     // moving Right 
     ranger5 = ImageIO.read(getClass().getResource(
       "/Images/Sprites/ranger/Ranger4.png")); 
     ranger6 = ImageIO.read(getClass().getResource(
       "/Images/Sprites/ranger/Ranger5.png")); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    array(); 

} 

public void array() { 
    rangerA = new ImageIcon[6]; 
    { 
     rangerA[0] = new ImageIcon(ranger1); 
     rangerA[1] = new ImageIcon(ranger2); 
     rangerA[2] = new ImageIcon(ranger3); 
     rangerA[3] = new ImageIcon(ranger4); 
     rangerA[4] = new ImageIcon(ranger5); 
     rangerA[5] = new ImageIcon(ranger6); 
    } 
} 

public void move() { 

    AbstractAction moveUp = new AbstractAction() { 

     private static final long serialVersionUID = 1L; 

     public void actionPerformed(ActionEvent e) { 
      System.out.println("Move up"); 
     } 

    }; 

    this.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("W"), "moveUp"); 
    this.getActionMap().put("moveUp", moveUp); 

    X += dX; 
    Y += dY; 

    dX = 0; 
    dY = 0; 

    if (movingRight || movingLeft) { 
     moving = true; 
    } 

} 

} 

我也試圖輸出,它會在控制檯上移,這樣我就可以瘦怎麼樣做出新的KeyBindings,但我不知道爲什麼它不起作用。任何解決方案/技巧將不勝感激。

P.S.我是Java新手,對於簡單的錯誤感到抱歉,我也意識到主遊戲窗口類中的循環。

編輯:移動()每隔幾毫秒調用一個單獨的計時器類。

+1

你永遠不會調用move()'...這就是鍵綁定將被添加的地方。但是你不應該在這種方法中加入它們(如果'move()'旨在實際移動遊俠) –

+2

即。在您的類的構造函數中添加綁定。 – camickr

+0

好吧我現在對jave進行了排序我認爲這是因爲我正在創建越來越多的keybindings,因爲move()在我的計時器類中每秒被調用一次。所以感謝camikr告訴我將綁定移動到構造器上。 – jack

回答

3

KeyStroke.getKeyStroke("W")不符合您的想法。使用此表單需要詳細描述該操作,即typed w

因此,我從來沒有使用它。相反,我更喜歡使用更直接的KeyStroke.getKeyStroke(KeyEvent.VK_W, 0)

有關更多詳細信息,請參閱KeyStroke#getKeyStroke(int, int)

由於您從未稱爲move方法,因此您也不會綁定關鍵筆劃。相反,綁定類構造函數中的鍵擊或其他一些只應調用一次的方法。

相關問題