java - 如何通过单击从数组中绘制?

标签 java arrays swing jpanel draw

我一直在玩下面的 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                   

}

最佳答案

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

关于java - 如何通过单击从数组中绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36951510/

相关文章:

java - 计算两个日期的差异

arrays - Matlab:在指定位置插入多个元素

javascript - 使用 JS 构建包含具有特定类的所有元素的数组

java - 让 JComboBox 在选择项目时更改显示的项目

java - 更改 GridLayout 中两个组件的位置

java - 在 jdbc 应用程序中向前移动 rs.next()

java - 字符串编码 TextView.setText()

java - 在所有 Activity 中保持我的 soundPool 样本加载

c++ - 如何将字符串数组的值分配给 "Name"+ #,例如。名称 1、名称 2、名称 3 等。C++

java - 我怎样才能安全地解决这个 Java 上下文类加载器问题?