Salve a tutti.
È da un po' di tempo che combatto con questo errore: Exception in thread "Thread-7" java.lang.NullPointerException.
Questa è la mia classe main:
package giococoniglio;
import java.awt.Dimension;
import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
/**
*
* @author tinti
*/
public class GiocoConiglio extends Canvas implements Runnable, MouseMotionListener, KeyListener, MouseListener{
private static final int larghezza = 1355;
private static final int altezza = 725;
private static final String nome_gioco = "Niglio Noè!";
BufferedImage foresta = null;
BufferedImage topo = null;
BufferedImage gatto = null;
BufferedImage sasso = null;
BufferedImage carota = null;
BufferedImage freccia = null;
private boolean giocoAttivo = false;
private Topo ogg_topo;
private Freccia ogg_freccia;
private PioggiaSasso pioggias;
private PioggiaCarote pioggiac;
public static ArrayList <Freccia> frecce;
public GiocoConiglio(){
caricaRisorse();
iniziaGioco();
}
public static void main(String[] args) {
GiocoConiglio gioco = new GiocoConiglio();
JFrame finestra_gioco = new JFrame(nome_gioco);
Dimension dimensione_finestra = new Dimension(larghezza,altezza);
finestra_gioco.setPreferredSize(dimensione_finestra);
finestra_gioco.setMaximumSize(dimensione_finestra);
finestra_gioco.setResizable(false);
finestra_gioco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
finestra_gioco.add(gioco);
gioco.addMouseMotionListener(gioco);
gioco.addMouseListener(gioco);
finestra_gioco.pack();
finestra_gioco.setVisible(true);
Thread thread_gioco = new Thread(gioco);
thread_gioco.start();
}
private void iniziaGioco(){
ogg_topo = new Topo(topo, freccia, 300, 90, 152,this);
pioggias = new PioggiaSasso(sasso, 1, 700, this);
pioggias.start();
pioggiac = new PioggiaCarote(carota, 1, 2000, this);
pioggiac.start();
}
private void caricaRisorse(){
CaricatoreImmagini loader = new CaricatoreImmagini();
foresta = loader.caricaImmagine("/Immagini/foresta.png");
topo = loader.caricaImmagine("/Immagini/coniglio.png");
sasso = loader.caricaImmagine("/Immagini/sasso.png");
carota = loader.caricaImmagine("/Immagini/carota.png");
freccia = loader.caricaImmagine("/Immagini/freccia.png");
}
private void disegna(){
BufferStrategy buffer = this.getBufferStrategy();
if(buffer == null){
createBufferStrategy(2);
return;
}
BufferStrategy buffer2 = this.getBufferStrategy();
if(buffer2 == null){
createBufferStrategy(3);
return;
}
BufferStrategy buffer3 = this.getBufferStrategy();
if(buffer3 == null){
createBufferStrategy(4);
return;
}
BufferStrategy buffer4 = this.getBufferStrategy();
if(buffer4 == null){
createBufferStrategy(5);
return;
}
BufferStrategy buffer5 = this.getBufferStrategy();
if(buffer5 == null){
createBufferStrategy(6);
return;
}
Graphics g = buffer.getDrawGraphics();
g.drawImage(foresta,0,0,larghezza,altezza, this);
ogg_topo.disegna(g);
pioggias.disegna(g);
pioggiac.disegna(g);
g.drawString("VITA NOÈ:"+ogg_topo.vita, 50, 50);
g.drawString("PUNTEGGIO :"+ogg_topo.punteggio, 50, 30);
if(frecce != null){
for(Freccia f : frecce){
f.disegna(g);
}
}
g.dispose();
buffer.show();
buffer2.show();
buffer3.show();
buffer4.show();
buffer5.show();
}
private void aggiorna(){
ArrayList<Sasso> sassi = pioggias.getSassi();
for(Sasso sasso : sassi){
if(GestoreCollisioni.ControllaCollisione(ogg_topo, sasso)){
sassi.remove(sasso);
ogg_topo.vita -= 10;
break;
}
if(GestoreCollisioni.ControllaCollisione(ogg_freccia,sasso)){
sassi.remove(sasso);
}
}
ArrayList<Freccia> frecce;
ArrayList<Carota> carote = pioggiac.getCarote();
for(Carota carota : carote){
if(GestoreCollisioni.ControllaCollisione(ogg_topo, carota)){
carote.remove(carota);
ogg_topo.vita += 5;
ogg_topo.punteggio += 10;
break;
}
}
if(controllaVittoria()){
this.giocoAttivo = false;
}
if(controllaSconfitta()){
this.giocoAttivo = false;
}
}
private boolean controllaVittoria(){
if(ogg_topo.punteggio >= 100){
return true;
}
return false;
}
private boolean controllaSconfitta(){
if(ogg_topo.vita <= 0){
return true;
}
return false;
}
@Override
public void run() {
giocoAttivo = true;
while(giocoAttivo){
aggiorna();
disegna();
}
}
public int getLarghezza(){
return larghezza;
}
public int getAltezza(){
return altezza;
}
@Override
public void mouseMoved(MouseEvent e) {
int posizione = (e.getPoint().x)-(ogg_topo.getLarghezza()/2);
if(posizione >= 0 && (posizione+ogg_topo.getLarghezza()) <= larghezza){
ogg_topo.setX(posizione);
}
}
@Override
public void mouseClicked(MouseEvent e) {
ogg_topo.spara();
}
@Override
public void mouseDragged(MouseEvent e) {}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}
Questo è l'errore:
Exception in thread "Thread-8" java.lang.NullPointerException
at giococoniglio.GestoreCollisioni.ControllaCollisione(GestoreCollisioni.java:15)
at giococoniglio.GiocoConiglio.aggiorna(GiocoConiglio.java:162)
at giococoniglio.GiocoConiglio.run(GiocoConiglio.java:211)
at java.lang.Thread.run(Thread.java:748)
La classe incriminata è:
package giococoniglio;
public class GestoreCollisioni {
public static boolean ControllaCollisione(Topo topo, Sasso sasso){
return topo.getBordi().intersects(sasso.getBordi());
}
public static boolean ControllaCollisione(Topo topo, Carota carota){
return topo.getBordi().intersects(carota.getBordi());
}
public static boolean ControllaCollisione(Freccia freccia, Sasso sasso){
15 return freccia.getBordi().intersects(sasso.getBordi());
}
}
Alla riga 15.
Con le altre classi la collisione funziona.
Non capisco perché con questa mi dia errore.
Come posso fare?