簡體   English   中英

如何從點擊中繪制數組?

[英]How to draw from an array on click?

我一直在玩下面的JPanel。 目前,我已經創建了幾個圓圈,您可以使用WASD按鍵移動其中一個。

我面臨的問題在於鼠標偵聽器。 我希望能夠單擊,然后這樣做,創建了一個玩家(從“塔”陣列中),並在鼠標點擊的位置上繪制了該玩家,最多可容納30個玩家(用於塔防游戲)。

下面的代碼編譯沒有錯誤,但是當我單擊屏幕時,我得到了運行時錯誤。 我知道我的錯誤是什么,但我不知道該如何解決。.使用this.draw(g); 在paint方法中返回一個找不到符號錯誤以進行繪制。 如何糾正代碼,以便能夠在鼠標所在的位置創建並繪制播放器? 如果您想要有關我的對象等的更多信息,我將項目中的所有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                   

}

您未在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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM