2016-04-30 7 views
1

私は以下のJPanelで遊んでいます。現時点では、いくつかのサークルを作成しました。そのうちの1つをWASDキーで移動できます。クリック時に配列から描画する方法は?

私が直面している問題は、マウスリスナーにあります。私はクリックすることができるようにしたいと思っています。そうすることで、プレーヤーを(タワーズアレイから)作成し、マウスクリックの場所に描いて、最大30人まで(タワー防衛ゲームのために)作ります。

以下のコードはエラーなしでコンパイルされますが、画面をクリックするとすぐにランタイムエラーが発生します。私は自分の間違いが何であるか知っていますが、どうやって逃げることができないのですか?this.draw(g)を使う。 paintメソッドでは、drawのシンボルエラーを見つけることができません。マウスの位置にプレーヤーを作成して描くことができるように、コードを修正するにはどうすればよいですか?あなたは私のオブジェクトなどの詳細が必要な場合、私はここの上にプロジェクト内のクラスのすべての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> 0である限りタワー[cnt]を描画するように設定しましたので、クリックするたびに描画されるはずです。それはなぜですか? –

関連する問題