Estoy haciendo mi proyecto y pues bueno al inicio tenía un ArrayList de enemigos, al momento de pasarlo a matriz me da este error, lo pasé a matriz porque debo cumplir con otras reglas y si lo hacía con arraylist no sería posible cumplir las reglas que me piden para el proyecto. si comento el método dibujar el error va a seguir pero esta vez en actualizar, que es para que se esté refrscando al pantalla para que se vaya dibujando en diferentes partes, por si mato un enemigo desparezca etc.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Domain.Juego.dibujar(Juego.java:55)
at GUI.JPAreaJuego.paintComponent(JPAreaJuego.java:32)
y sigue para abajo, pero lo demás no son errores en mi código solo esas 3 primeras adjunto el código que presenta errores.
import java.awt.Graphics;
import java.util.ArrayList;
public class Juego {
private Jugador jugador;
private Enemigos[][] enemigos;
private Fondo fondo;
private TanqueAntidoto tanqueAntidoto;
private Blaster blaster;
private Nivel nivel;
public Juego() {
this.blaster = new Blaster();
this.jugador = new Jugador(blaster);
this.enemigos = new Enemigos[30][40];
this.fondo=new Fondo();
this.tanqueAntidoto = new TanqueAntidoto();
this.nivel = new Nivel();
this.crearEnemigos();
} // Constructor
private void crearEnemigos() {
for (int i = 0; i < nivel.aparicionVirus.length; i++) {
for (int j = 0; j < nivel.aparicionVirus[i].length; j++) {
if(Nivel.aparicionVirus[i][j] == 1) {
enemigos[i][j]= new CepaL(i,j);
}
if(Nivel.aparicionVirus[i][j] == 2) {
this.enemigos[i][j]=new CepaS(i,j);
}
if(Nivel.aparicionVirus[i][j] == 3) {
this.enemigos[i][j]=new CepaV(i,j);
}
} // For j
} // For i
} // Crear Enemigos
public void dibujar(Graphics g) {
this.fondo.dibujar(g);
this.jugador.dibujar(g);
for (int i = 0; i < enemigos.length; i++) {
for (int j = 0; j < enemigos.length; j++) {
this.enemigos[i][j].dibujar(g);
} // For
} // For
} // Dibujar
public void actualizar() {
this.tanqueAntidoto.actualizar();
this.jugador.actualizar();
this.jugador.chequearAtaque(this.enemigos);
for (int i = 0; i < this.enemigos.length; i++) {
for (int j = 0; j < enemigos.length; j++) {
this.enemigos[i][j].chequearAtaque(this.jugador);
}
} // for
} // Actualizar
// Setter && Getters
public Jugador getJugador() {
return jugador;
}
public void setJugador(Jugador jugador) {
this.jugador = jugador;
}
public Enemigos[][] getEnemigos() {
return enemigos;
}
public Fondo getFondo() {
return fondo;
}
public TanqueAntidoto getTanqueAntidoto() {
return tanqueAntidoto;
}
public Nivel getNivel() {
return nivel;
}
public void setEnemigos(Enemigos[][] enemigos) {
this.enemigos = enemigos;
}
public void setFondo(Fondo fondo) {
this.fondo = fondo;
}
public void setTanqueAntidoto(TanqueAntidoto tanqueAntidoto) {
this.tanqueAntidoto = tanqueAntidoto;
}
public void setNivel(Nivel nivel) {
this.nivel = nivel;
}
} // Class Juego
package GUI;
import java.awt.Color;
import java.awt.Dimension;
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 javax.swing.JPanel;
import Domain.Enemigos;
import Domain.Juego;
public class JPAreaJuego extends JPanel implements KeyListener,MouseListener {
private Juego juego;
public JPAreaJuego() {
this.setPreferredSize(new Dimension(800, 600));
this.setFocusable(true);
this.requestFocus();
this.addKeyListener(this);
this.addMouseListener(this);
this.juego = new Juego();
} // JPanel del área de juego
protected void paintComponent(Graphics g) {
this.juego.dibujar(g);
this.juego.actualizar();
this.repaint();
} // paintComponent
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) {
this.juego.getJugador().movimientoArriba();
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
this.juego.getJugador().movimientoAbajo();
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
this.juego.getJugador().movimientoDerecha();
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
this.juego.getJugador().movimientoIzquierda();
}
} // Movimiento
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
} // Para las teclas
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
this.juego.getJugador().disparar(e.getX(), e.getY());
}
public void mouseReleased(MouseEvent e) {
}
} // Class
los errores se presentan en el método para dibujar los enemigos en el JPanel, como dije antes cuando era un ArrayList no daba error ahora con la matriz me da error.
en el método dibujar y en el actualizar en la misma parte del for para ser más específico en el
for (int i = 0; i < enemigos.length; i++) {
for (int j = 0; j < enemigos[0].length; j++) {
this.enemigos[i][j].dibujar(g);
} // For j
} // For i
Ok, revisé la clase Nivel, que es una matriz compuesto de enteros de 0 a 3, donde 1,2,3 son diferentes tipos de enemigos, el 0 es un espacio vacío y me faltaban 2 filas, por eso me daba el error gracias a los que me comentaron y me hicieron notarlo, ahora si me pudiera seguir ayudando, ya que ahora me da este error que adjunto después de la clase nivel.
public class Nivel {
public static int[][] aparicionVirus = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,2,1,3,0,0,0,0,0,0,0,3,1,0,1,0,1,3,0,1,0,0,0,1,3,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,3,0,3,0,0,0,1,2,0,1,2,0,0,2,0,0,0,1,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,3,2,0,1,0,0,0,2,1,0,0,2,0,0,1,2,0,1,2,0,0,2,0,3,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,1,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,1,0,0,1,0,2,1,0,3,0,0,0,1,2,0,1,2,0,1,2,0,0,2,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,3,2,0,1,0,0,0,2,1,0,0,2,0,0,1,2,0,1,2,0,0,2,0,3,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,0,0,0,0,0,1,0,0,3,0,3,0,0,0,1,2,0,1,2,0,0,2,0,0,0,1,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,1,0,0,1,0,2,1,0,3,0,0,0,1,2,0,1,2,0,1,2,0,0,2,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,3,2,0,1,0,0,0,2,1,0,0,2,0,0,1,2,0,1,2,0,0,2,0,3,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,0,0,0,0,0,1,0,0,3,0,3,0,0,0,1,2,0,1,2,0,0,2,0,0,0,1,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
{0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},};
} // Clase Nivel
Este error es en la creación de enemigos.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 30 out of bounds for length 30
at Domain.Juego.crearEnemigos(Juego.java:33)
Para ser más preciso en esta parte
for (int i = 0; i < nivel.aparicionVirus.length; i++) {
for (int j = 0; j < nivel.aparicionVirus[i].length; j++) {
if(Nivel.aparicionVirus[i][j] == 1) {
enemigos[i][j]= new CepaL(i,j);
}
if(Nivel.aparicionVirus[i][j] == 2) {
this.enemigos[i][j]=new CepaS(i,j);
}
if(Nivel.aparicionVirus[i][j] == 3) {
this.enemigos[i][j]=new CepaV(i,j);
}
} // For j
} // For i
me lo da cuando creo un nuevo enemigo.