2014-03-31 54 views
0

我需要一點幫助,我是新的語言,因此我不知道如何實現這樣的。我需要一點幫助在Java網格上實現玩家動作

我已經做了一個基本的15; 40格JLabel圖片,感謝這個網站,以及我需要幫助的是關於如何使一個球員(假設是一個圖像,也顯示在網格上)移動圍繞使用WASD(我不知道Ascii-approach是否適用於Java)或箭頭鍵。

下面是我對電網

public class GUI { 
    static Scanner cns = new Scanner(System.in); 
    JFrame frame = new JFrame(); 
    ImageIcon ImageIcon = new ImageIcon("Grass.png"); 
    JLabel[][] grid; 

    public GUI(int width, int length) { 
     Container pane = frame.getContentPane(); 
     frame.setLayout(new GridLayout(width,length)); 
     grid = new JLabel[width][length]; 

     for(int y = 0; y < length; y++) { 
      for(int x = 0; x < width; x++) { 
       grid[x][y] = new JLabel(); 
       grid[x][y].setBorder(BorderFactory.createLineBorder(Color.black)); 
       grid[x][y].setBorder(BorderFactory.createEmptyBorder()); 
      } 
     } 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 

     for(int y = 0; y < length; y++) { 
      for(int x = 0; x < width; x++) { 
       pane.add(grid[x][y]= new JLabel(new ImageIcon("Grass.png"))); 
       grid[x][y].setBorder(BorderFactory.createLineBorder(Color.black)); 
       grid[x][y].setBorder(BorderFactory.createEmptyBorder()); 
       frame.add(grid[x][y]); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     new GUI(15, 40);  
    } 
} 
+0

而不是使用掃描儀,我建議你使用KeyListeners。 http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html –

+0

我曾嘗試使用KeyListener。但我的播放器甚至不會顯示... D: – Einelle

+0

好的,我很快就會發佈一個答案,我會在我回家後添加一個深入的例子... –

回答

0

夫婦的建議,這裏代碼:

1 - 讓GUI擴展的JFrame和實施的KeyListener。

您必須重寫KeyListener方法(keyPressed,keyReleased和keyTyped),並且應該從JFrame覆蓋repaint()。

repaint方法應該在最後調用super.repaint()來更新幀。

2 - 讓GUI的字段存儲關於需要繪製的東西的數據。

您可能應該存儲網格或網格中的內容。

3 - 構造函數應初始化,而不是渲染。

渲染應該在repaint()中完成。構造函數應該這樣做:

super(); 
    JPanel frame = new JPanel(); 
    add(frame); 
    pack(); 
    addKeyListener(this); 
    repaint(); 

這個答案還沒有完成,但我會更多地關注它並更新它。特別是,JPanel是JFrame中的一個元素。


更新:這是一個小的工作示例。使用WASD在屏幕上移動矩形。


這是JFrame。

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 

public class MyJFrame extends JFrame implements KeyListener { 

    private MyJPanel frame; 

    public MyJFrame() { 
     super(); 
     frame = new MyJPanel(); 
     add(frame); 
     pack(); 
     addKeyListener(this); 
     repaint(); 
    } 

    public static void main(String[] args) { 
     MyJFrame window = new MyJFrame(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setVisible(true); 
     window.setTitle("Test"); 
    } 

    @Override 
    public void repaint() { 
     super.repaint(); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     frame.keyPressed(e); 
     repaint(); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { } 

    @Override 
    public void keyReleased(KeyEvent e) { } 
} 

這是JPanel的。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import javax.swing.JPanel; 

public class MyJPanel extends JPanel { 

    private int x = 0; 
    private int y = 0; 

    public MyJPanel() { 
     setPreferredSize(new Dimension(200,200)); 
    } 

    @Override 
    public void update(Graphics g) { 
     paint(g); 
    } 

    @Override 
    public void paint(Graphics g) { 
     g.setColor(Color.red); 
     g.drawRect(x,y,20,20); 
    } 

    public void keyPressed(KeyEvent e) { 
     int k = e.getKeyCode(); 

     switch (k) { 
      case KeyEvent.VK_D: 
       x++; 
       break; 
      case KeyEvent.VK_A: 
       x--; 
       break; 
      case KeyEvent.VK_W: 
       y--; 
       break; 
      case KeyEvent.VK_S: 
       y++; 
       break; 
     } 
    } 
} 

祝你好運!

+0

我想知道什麼是使用超(); ? :[ – Einelle

+0

Super調用超類的構造函數。在這種情況下,因爲它擴展了JFrame,所以它調用JFrame的構造函數。默認情況下,所有的構造函數調用它們的超級構造函數,但這使得它更清晰,更明顯...... –

+0

這裏讓我試圖弄清楚這一點...... –