2014-04-23 56 views
0

我正在制作太空入侵者类型的游戏,并且我正在尝试实施碰撞检测,以便如果击中目标,目标将从框架中移除。但是我在下面的标记行中得到一个空指针异常(我也会发布异常跟踪)。问题是因为我没有正确设置拍摄对象的y坐标吗?我试图解决这个问题,但没有发生任何事情,尽管我可能没有以适当的方式做到这一点。尝试获取对象的y坐标时无法解决NullPointerException

这里有两个相关的课程,我可以张贴更多,如果必要的:

public class GamePanel extends JPanel { 

Launcher launcher1; 
Background bground1; 
public static Shot shot; 
public int shotCounter; 
public int rCount; 
public int cCount; 
Timer timer; 
Timer eTimer; 
Timer rTimer; 
Timer cTimer; 
Russia russia; 
China china; 
public ArrayList<Object> enemies; 


public GamePanel() throws IOException { 
    super(); 
    enemies = new ArrayList<>(); 
    this.shotCounter = 0; 
    launcher1 = new Launcher(); 
    bground1 = new Background(); 
    timer = new Timer(10, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      componentMove(3); 
      repaint(); 
     } 
    }); 
    rTimer = new Timer(10, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      componentMove(1); 
      repaint(); 
     } 
    }); 
    cTimer = new Timer(10, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      componentMove(2); 
      repaint(); 
     } 
    }); 
    eTimer = new Timer(10, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      addEnemy(); 
      eTimer.setDelay(7000); 
      repaint(); 
     } 
    }); 
    eTimer.start(); 
}//end constructor 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(bground1.background, 0, 0, getWidth(), getHeight(), null); 
    g.drawImage(launcher1.baldEagleImage, launcher1.getLxCoord(), launcher1.lyCoord, null);//paint the launcher 
    if (rCount == 1) { 
     g.drawImage(russia.image, russia.getXCoord(), russia.getYCoord(), null); 
     rTimer.start(); 
    } 
    if (cCount == 1) { 
     g.drawImage(china.image, china.getXCoord(), china.getYCoord(), null); 
     cTimer.start(); 
    } 
    if (shotCounter == 1) { 
     g.drawImage(shot.mcDShotImage, shot.staticXLauncherCoord, shot.getSyCoord(), null); 
     timer.start(); 
    } 
}//end paintComponent method 

public void move(GamePanel gamePanel) { 
    launcher1.moveX(); 
    repaint(); 
}//end move method 

public void componentMove(int c) { 
    if (c == 1) { 
     do { 
      russia.move(); 
     } while (!collisionDetected(russia)); 
    } else if (c == 2) { 
     do { 
      china.move(); 
     } while (!collisionDetected(china)); 
    } else if (c == 3) { 
     shot.moveY(); 
    } 
} 

public boolean collisionDetected(Entity object) { 
    // Create variables to hold temporary values to check for ball colision 
    int oTempX = object.getXCoord(); 
    int oTempY = object.getYCoord(); 
    int oTempW = object.getImageWidth(); 
    int oTempH = object.getImageHeight(); 
    int sTempX = shot.staticXLauncherCoord; 
    int sTempY = shot.getSyCoord();  // THIS IS THE EXCEPTION 
    int sTempH = shot.mcDShotImage.getHeight(); 
    int sTempW = shot.mcDShotImage.getWidth(); 
    double xDiff = Math.pow((oTempX - sTempX), 2); 
    double yDiff = Math.pow((oTempY - sTempY), 2); 
    double hSum = Math.pow(oTempH + sTempH, 2); 
    double wSum = Math.pow(oTempW + sTempW, 2); 
    if (shotCounter == 1) { 
     if ((xDiff + yDiff) <= hSum) {//use the ball heights to check if two balls intersect 
      if ((xDiff + yDiff) <= wSum) {//use the ball widths to check if two balls intersect 
       enemies.remove(this); 
       repaint(); 
       return true; 
      } else { 
       return false; 
      } 
     } else { 
      return false; 
     } 
    } else { 
    return false; 
    } 
} 

public void addShot() { 
    try { 
     shot = new Shot(); 
     shotCounter = 1; 
     repaint(); 
    } catch (IOException ex) { 
    } 
} 

public void addEnemy() { 
    int enemy = (int) (Math.round(Math.random())); 
    if (enemy == 0) { 
     try { 
      enemies.add(russia = new Russia()); 
      rCount = 1; 
      repaint(); 
     } catch (IOException ex) { 
     } 
    } else { 
     try { 
      enemies.add(china = new China()); 
      cCount = 1; 
      repaint(); 
     } catch (IOException ex) { 
     } 
    } 
} 

}//end GamePanel class 


public class Shot { 

public int syCoord; 
public int sRise = 1; 
public BufferedImage mcDShotImage; 
GamePanel gPanel; 
public static int staticXLauncherCoord; 

public Shot() throws IOException { 
    staticXLauncherCoord = Launcher.getLxCoord() + 10; 
    syCoord = 381; 
    mcDShotImage = ImageIO.read(new File("mcdonaldsarchesshot.jpg")); 
}//end constructor 

public void moveY() { 
    do { 
    syCoord -= sRise; 
    setSyCoord(syCoord); 
    } while (syCoord <= 1); 
}//end moveY method 

public void setSyCoord(int syCoord) { 
    this.syCoord = syCoord; 
} 

public int getSyCoord() { 
    return syCoord; 
} 

}//end Shot class 

这里的例外打印:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at GamePanel.collisionDetected(GamePanel.java:125) 
at GamePanel.componentMove(GamePanel.java:112) 
at GamePanel$3.actionPerformed(GamePanel.java:65) 
at javax.swing.Timer.fireActionPerformed(Timer.java:312) 
at javax.swing.Timer$DoPostEvent.run(Timer.java:244) 
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:694) 
at java.awt.EventQueue$3.run(EventQueue.java:692) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+4

我强烈怀疑'shot'是空的。由于您正在访问一个静态变量,因此您不会在上一行中发现它,因此可以更好地将其写为'Shot.staticXLauncherCoord',以清楚说明'shot'的*值*不相关。它确实没有帮助,每次你捕捉到一个异常,你吞下* no *日志记录或其他体面的处理。 –

+0

@JonSkeet是的,你是对的。我是愚蠢的,必须在我的构造函数中意外粘贴addShot()调用。谢谢,对不起,浪费时间! – Ben

回答

1

你在哪里/何时调用addShot?这是shot初始化的唯一逻辑(通过shot = new Shot())。

从您的堆栈跟踪,似乎actionPerformed电话componentMove这就要求collisionDetected,但是这些都曾经呼吁addShot等你的公共静态shot从未初始化,并为空(因此除外)。

请注意,访问shot的公共静态staticXLauncherCoord不是问题,因为它是静态的,并且与Shot的实例无关。

+0

谢谢!当我在复制新的东西时,我必须在我的构造函数中意外地粘贴了addShot()。那是愚蠢的我不能看到,我被扔掉了,因为我把镜头的staticXLauncherCoord字段变成静态的,我正在被愚蠢和忘记。 – Ben

1

你没有初始化出手。可能是因为collisionDetected()在addShot()之前被调用。

+0

你是对的,我是愚蠢的,没有注意到。我一定在意外时在我的构造函数中粘贴了我的addShot()调用。谢谢,对不起,浪费时间! – Ben

相关问题