如何在单击时从数组中绘制?
How to draw from an array on click?
我一直在研究下面的 JPanel。目前,我创建了几个圆圈,其中一个可以使用 WASD 键移动。
我面临的问题出在鼠标侦听器上。我希望能够点击,然后创建一个玩家(从 "towers" 数组)并绘制在鼠标点击的位置,最多 30 个玩家(这是一个塔防游戏).
下面的代码编译没有错误,但是我一点击屏幕就出现运行时错误。我知道我的错误是什么,但我不知道如何解决它。使用 this.draw(g);在 paint 方法中 returns a cannot find symbol error for 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
}
您没有设置正确的数组...在 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);
}
}
我一直在研究下面的 JPanel。目前,我创建了几个圆圈,其中一个可以使用 WASD 键移动。
我面临的问题出在鼠标侦听器上。我希望能够点击,然后创建一个玩家(从 "towers" 数组)并绘制在鼠标点击的位置,最多 30 个玩家(这是一个塔防游戏).
下面的代码编译没有错误,但是我一点击屏幕就出现运行时错误。我知道我的错误是什么,但我不知道如何解决它。使用 this.draw(g);在 paint 方法中 returns a cannot find symbol error for 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
}
您没有设置正确的数组...在 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);
}
}