2013-01-05 49 views
1

我正在學習Java中的一些新東西並且有點困難 - 這是圖形!下面我解釋兩個班級所做的事情。我現在的新障礙正在想出一種方法,通過只按Z來爲球體(即:像激光那樣的射彈)繪製不同的圖像。Java圖形如何在keyPressed中繪製圖像

問題是如果我編寫一個方法例如: 「g.drawImage(laser,laser_dx,laser_dy,this)在包含」KeyEvent.VK_Z「的if語句中,我的keyPressed方法突然說」這個方法不是在本地使用「。我有什麼辦法來解決這個障礙?

什麼我迄今所做的寫入包含我的程序的所有的鍵盤事件「遊戲鍵盤」類中的嵌套類。

 private class Adapter extends KeyAdapter 
     { 

       public void keyPressed(KeyEvent e) 
      { 
       int keyCode = e.getKeyCode(); 
       if(keyCode == KeyEvent.VK_RIGHT) 
       { 
        ball_dx += ball_velocity; 

       } 
       if(keyCode == KeyEvent.VK_LEFT) 
       { 
        ball_dx -= ball_velocity; 
       } 
       if(keyCode == KeyEvent.VK_Z){ 

       } 

      } 

     } 

下面是一個名爲「Gameboard」的獨立類中的繪圖圖形方法:這個類只繪製了一個綠色球(這是一個.png圖像)的圖像,它可以用箭頭鍵左右移動!

public class GameBoard extends JPanel implements ActionListener 
    { 

     public void paintComponent(Graphics g) 
      { 

      super.paintComponent(g); 

      g.drawImage(ball, ball_dx, ball_dy, this); 

      Toolkit.getDefaultToolkit().sync(); 

     } 

     public void actionPerformed(ActionEvent arg0) 
     { 

      repaint(); 
     } 

    } 

回答

3

你必須重新思考的邏輯:一個處理的關鍵事件和借鑑一切都應該共享狀態的代碼代碼,以便

  • 事件設置
  • 圖紙改變按照國家國家

只是爲了簡單和給你的想法:

boolean isLaser = false; 

public void keyPressed(KeyEvent e) { 
    isLaser = true; 
} 

public void keyReleased(KeyEvent e) { 
    isLaser = false; 
} 

public void paintComponent(Graphics g) { 
    if (isLaser) 
    // do something 
} 

當然,在更復雜的環境中,你將有一個像

List<Entity> entities = new ArrayList<Entity>(); 

public void paintComponent(Graphics g) { 
    for (Entity e : entities) 
    e.draw(g); 
} 

public void keyPressed() { 
    entities.add(new LaserEntity(...)); 
} 
+0

更加結構化的解決方案,我會嘗試你的方法傑克。感謝這些簡單而複雜的例子,它給了我足夠的理由來讓我思考你的方法。 =] – Nicholas