2015-08-09 59 views
1

我得到了蛇運行,現在我嘗試讓keypressed()方法工作。我不認爲它是從鍵盤聽。我的想法是,例如,如果按下向下鍵,變量方向設置爲1,並且switch case語句將處理該變量。我懷疑方向變量沒有被開關盒讀取。蛇遊戲。處理keyPressed方法

我的主類:

package com.bin.snake; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class Game extends JPanel{ 

boolean playingSnake = true; 
Snake snake = new Snake(); 

public Game() { 
    addKeyListener(new KeyListener() { 

     @Override 
     public void keyTyped(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void keyPressed(KeyEvent e) { 

      snake.keyPressed(e); 
     } 
    }); 
    setFocusable(true); 
} 

public void paint(Graphics g) {// inherit paint method of JPanel class with 
    // parameter g type Graphics 
    // parameter g is the object to paint things 
    super.paint(g); // erase latest image 
    Graphics2D g2d = (Graphics2D) g; // casting g to Graphics2D type 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  RenderingHints.VALUE_ANTIALIAS_ON);// rendering 
                           // image 
    snake.paint(g2d); 

} 

public static void main(String[] args) { 
    JFrame frame = new JFrame("Snake!"); 
    frame.setVisible(true); 
    frame.setSize(800, 600); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Game game = new Game(); 
    frame.add(game); 
    while (true) { 
     game.updateGame(); 
     game.repaint(); 
     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

public void updateGame() { 
    snake.moveSnake(); 
} 

}

我的蛇類:

package com.bin.snake; 

import java.awt.Graphics2D; 
import java.awt.event.KeyEvent; 

public class Snake { 

private Game game; 
int iSnakeLength = 10; 
int direction = 1; 
final int SIDE = 13; 

int[] snakeY = new int[2000]; 
int[] snakeX = new int[2000]; 
int xs = 0; 
int ys = 0; 

public void moveSnake() { 

    switch (direction) { 
    case 0:// up 
     snakeY[0] -=1.5; 
     break; 
    case 1:// down 
     snakeY[0] += 1.5; 
     break; 
    case 2:// right 
     snakeX[0] += 1.5; 
     break; 
    case 3:// left 
     snakeX[0] -=1.5; 
     break; 
    } 

    for (int i = iSnakeLength; i > 0; i--) { 
     snakeX[i] = snakeX[i - 1]; 
     snakeY[i] = snakeY[i - 1]; 

    } 
} 

public void paint(Graphics2D g) { 
    g.fillRect(snakeX[0], snakeY[0], SIDE, SIDE); 
    for (int i = 0; i < iSnakeLength; i++) { 
     g.fillRect(snakeX[i + 1], snakeY[i + 1], SIDE, SIDE); 
    } 

} 

public void keyPressed(KeyEvent e){ 
    if(e.getKeyCode() == KeyEvent.VK_DOWN){ 
     direction = 1; 
    } 
    if(e.getKeyCode() == KeyEvent.VK_UP){ 
     direction = 0; 
    } 
    if(e.getKeyCode() == KeyEvent.VK_LEFT){ 
     direction = 3; 
    } 
    if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 
     direction = 2; 
    } 
} 

}

+0

使用鍵綁定,其他答案是錯的 – MadProgrammer

回答

2

我不認爲它是從鍵盤監聽。我的想法

KeyEvents僅派發給焦點組件。 JPanel默認情況下不支持焦點。

爲了讓你使用一個面板可聚焦:

panel.setFocusable(true); 

其他評論:

  1. 風俗畫是通過覆蓋paintComponent(...)方法,而不是paint()方法來完成。有關更多信息和示例,請參閱Custom Painting上的Swing教程。

  2. 你不應該使用KeyListener。 Swing旨在與Key Bindings一起使用。請閱讀有關How to Use Key Bindings的Swing教程。您還可以查看Motion Using the Keyboard,其中包含使用鍵綁定移動組件的工作示例。

  3. 對於動畫,您應該使用擺動計時器來安排動畫。檢查我已經提供的教程鏈接中的目錄。有關於How to Use Swing Timers的部分。