2016-04-30 32 views
1

我一直在玩下面的JPanel。目前,我創建了一個圈子,其中一個可以使用WASD鍵移動。如何在點擊時從數組中繪製?

我面臨的問題在於鼠標監聽器。我希望能夠點擊,並在此過程中,創建一個玩家(從「塔」陣列),並在鼠標點擊的位置繪製,最多可以有30名玩家(這是一個塔防遊戲)。

下面的代碼編譯沒有錯誤,但一旦我點擊屏幕就會出現運行時錯誤。我知道我的錯誤是什麼,但我不知道如何解決它。使用this.draw(g);在繪製方法中返回一個無法找到繪製的符號錯誤。我該如何糾正我的代碼,以便能夠在鼠標的位置創建和繪製播放器?如果你想對我的對象等更多的信息,我已經貼在類的所有3項目在這裏:http://pastebin.com/cLHsRU4y

public class game extends javax.swing.JPanel implements KeyListener{ 
private int x = 20; 
private int y = 20; 
private int cnt = 0; 
private player Player; 
private player maximus; 
private player[] towers; 

public game() { 
setFocusable(true); 
addKeyListener(this); 

addMouseListener(new MouseAdapter(){ 
    @Override 
    public void mousePressed(MouseEvent m) 
     { 
      if(cnt==0) 
     { 
      setArray(); 
     } 
      int mx=m.getX(); 
      int my=m.getY(); 
      towers[cnt].setX(mx); //NULL POINTER EXCEPTION ON THIS LINE 
      towers[cnt].setY(my); 
     // towers[cnt].draw(z); 
      cnt++; 


    //repaint(); 
      cnt++; 
     } 
}); 
Player = new player(100,100); 
maximus = new player(490,300); 
    initComponents(); 
} 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    setBackground(new java.awt.Color(200, 22, 0)); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
    this.setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 907, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 521, Short.MAX_VALUE) 
    ); 
}// </editor-fold>       
public void setArray() 
{ 
    player towers[] = new player[30]; 
    for(int i=0; i<30; i++) 
    { 
     towers[i] = new player(5,5); 
    } 
} 

public void paint(Graphics g) 
{ 
    g.setColor(Color.gray); 
    g.fillRect(0, 0, getWidth(), getHeight()); 

    g.setColor(Color.ORANGE); 
    g.fillOval(x, y, 20,20); 
    Player.draw(g); 
    maximus.draw(g); 
    if(cnt>0) 
    { 
    towers[cnt].draw(g); 
    } 


    repaint(); 
} 


@Override 
public void keyTyped(KeyEvent e) { 

} 

@Override 
public void keyPressed(KeyEvent e) { 
int c = e.getKeyCode(); 
    if(c==KeyEvent.VK_W) 
    { 
     y-=1; 
     Player.setYDir(-1); 
    } 
    if(c==KeyEvent.VK_S) 
    { 
     y+=1; 
     Player.setYDir(1); 
    } 
    if(c==KeyEvent.VK_A) 
    { 
     x-=1; 
     Player.setXDir(-1); 
    } 
    if(c==KeyEvent.VK_D) 
    { 
     x+=1; 
     Player.setXDir(1);    
    } 


} 
@Override 
public void keyReleased(KeyEvent e) { 
    Player.setXDir(0); 
    Player.setYDir(0); 
} 

// Variables declaration - do not modify      
// End of variables declaration     

}

回答

3

您沒有設置合適的陣列...在setArray()方法,你應該使用this.towers [當你得到你的NPE時聲明和試圖使用的全局變量]來設置,而不是創建一個本地變量,它將在方法。 (你現在是怎麼做的,數組中目前沒有任何元素可以使用)。

public void setArray() 
{ 
    //Use the global variable and don't create a local one 
    this.towers = new player[30]; 
    for(int i = 0; i < 30; i++) 
    { 
     towers[i] = new player(5,5); 
    } 
} 
+0

如果問題不是太多,你可以提供語法嗎? –

+0

@MorganBlem補充說,這應該可以解決你的錯誤。 – user2494817

+0

謝謝。這解決了我的錯誤。作爲後續問題,塔樓實際上並沒有吸引點擊。如果你看看我的繪畫方法,我已經設置它繪製塔[cnt]只要cnt> 0(以避免空指針異常),所以它應該繪製每次我點擊。爲什麼不是? –