diff --git a/src/main/java/net/h4ckx0r/Arkanoid.java b/src/main/java/net/h4ckx0r/Arkanoid.java index 3695e56..5bb6267 100644 --- a/src/main/java/net/h4ckx0r/Arkanoid.java +++ b/src/main/java/net/h4ckx0r/Arkanoid.java @@ -27,6 +27,8 @@ public class Arkanoid { private static int anchoVentana = separacionBloques + ((anchoLadrillos + separacionBloques) * numLadrillosPorLinea); private List actores = crearActores(); + private List actoresParaEliminar = new ArrayList(); + private List actoresParaIncorporar = new ArrayList(); private JFrame ventana = new JFrame("Arkanoid - Natanael Gómez Ortiz"); private MiCanvas canvas = new MiCanvas(actores); @@ -112,17 +114,17 @@ public class Arkanoid { public static List crearActores() { List actores = new ArrayList(); - int anchoJugador = 40; - int altoJugador = 10; - actores.add(new Jugador(anchoJugador, altoJugador, (anchoVentana - anchoJugador) / 2, altoVentana - (altoVentana / 9))); + int anchoJugador = 55; + int altoJugador = 15; + actores.add(new Jugador(anchoJugador, altoJugador, (anchoVentana - anchoJugador) / 2, altoVentana - (altoVentana / 9), ResourceCache.IMAGEN_JUGADOR)); int diametroPelota = 20; - actores.add(new Pelota(diametroPelota, (anchoVentana - diametroPelota) / 2, 400)); + actores.add(new Pelota(diametroPelota, (anchoVentana - diametroPelota) / 2, 400, ResourceCache.IMAGEN_PELOTA)); - for (int i = 0; i < Ladrillo.colores.length; i++) { + for (int i = 0; i < ResourceCache.IMAGEN_LADRILLO.length; i++) { for (int j = 0; j < numLadrillosPorLinea; j++) { - actores.add(new Ladrillo(anchoLadrillos, 10, i, j, separacionBloques, altoVentana/12)); + actores.add(new Ladrillo(anchoLadrillos, 10, i, j, separacionBloques, altoVentana / 12, ResourceCache.IMAGEN_LADRILLO)); } } @@ -135,27 +137,32 @@ public class Arkanoid { int milisegundosPorFrame = 1000 / FPS; - while (true) { - long tiempoInicio = new Date().getTime(); + while (true) { + long tiempoInicio = new Date().getTime(); - if (!pausado) { - for (Actor actor : actores) { - actor.actua(); - } - canvas.pintar(); + if (!pausado) { + for (Actor actor : actores) { + actor.setFrameTerminado(false); } - - long tiempoTranscurrido = new Date().getTime() - tiempoInicio; - int milisPausa = (int) (milisegundosPorFrame - tiempoTranscurrido); - milisPausa = Math.max(milisPausa, 0); - - try { - Thread.sleep(milisPausa); - } catch (InterruptedException e) { - e.printStackTrace(); + for (Actor actor : actores) { + actor.actua(); } + detectarColisiones(); + actualizarActores(); + canvas.pintar(); } + long tiempoTranscurrido = new Date().getTime() - tiempoInicio; + int milisPausa = (int) (milisegundosPorFrame - tiempoTranscurrido); + milisPausa = Math.max(milisPausa, 0); + + try { + Thread.sleep(milisPausa); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } private static void cerrarVentana() { @@ -168,6 +175,41 @@ public class Arkanoid { } } + private void detectarColisiones() { + for (Actor act1 : this.actores) { + Rectangle act1Rectangle = new Rectangle(act1.getX(), act1.getY(), act1.getAncho(), act1.getAlto()); + + for (Actor act2 : this.actores) { + if (!act1.equals(act2)) { + Rectangle act2Rectangle = new Rectangle(act2.getX(), act2.getY(), act2.getAncho(), act2.getAlto()); + + if (act1Rectangle.intersects(act2Rectangle)) { + act1.colisionaCon(act2, act1Rectangle, act2Rectangle); + act2.colisionaCon(act1, act2Rectangle, act1Rectangle); + } + + } + } + } + } + + public void incorporaActor(Actor a) { + this.actoresParaIncorporar.add(a); + } + + public void eliminaActor(Actor a) { + this.actoresParaEliminar.add(a); + } + + private void actualizarActores() { + this.actores.removeAll(actoresParaEliminar); + this.actoresParaEliminar.clear(); + + this.actores.addAll(actoresParaIncorporar); + this.actoresParaIncorporar.clear(); + } + + public static void main(String[] args) { Arkanoid.getInstance().bucleJuego(); } diff --git a/src/main/java/net/h4ckx0r/ResourceCache.java b/src/main/java/net/h4ckx0r/ResourceCache.java new file mode 100644 index 0000000..af52b36 --- /dev/null +++ b/src/main/java/net/h4ckx0r/ResourceCache.java @@ -0,0 +1,48 @@ +package net.h4ckx0r; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.net.URL; +import java.util.HashMap; + +public class ResourceCache { + + public static final String IMAGEN_JUGADOR = "Player1.png"; + public static final String IMAGEN_PELOTA = "Pelota.png"; + public static final String[] IMAGEN_LADRILLO = new String[] {"LadrilloRojo.png", "LadrilloNaranja.png", "LadrilloAmarillo.png", "LadrilloVerde.png", "LadrilloAzul.png", "LadrilloAzulOscuro.png" }; + + + private HashMap cacheImagenes = new HashMap<>(); + + private static ResourceCache instance = null; + + public static ResourceCache getInstance() { + if (instance == null) { + instance = new ResourceCache(); + } + return instance; + } + + + private BufferedImage cargarImagen (String nombreImg) { + URL imgPath; + try { + imgPath = getClass().getResource(nombreImg); + return ImageIO.read(imgPath); + } catch (IOException e) { + e.printStackTrace(); + System.exit(0); + } + return null; + } + + public BufferedImage getImage (String nombreImg) { + BufferedImage img = cacheImagenes.get(nombreImg); + if (img == null) { + img = cargarImagen("/images/" + nombreImg); + cacheImagenes.put(nombreImg, img); + } + return img; + } +} diff --git a/src/main/java/net/h4ckx0r/actores/Actor.java b/src/main/java/net/h4ckx0r/actores/Actor.java index 1d2ba8e..cb8ed6b 100644 --- a/src/main/java/net/h4ckx0r/actores/Actor.java +++ b/src/main/java/net/h4ckx0r/actores/Actor.java @@ -1,11 +1,26 @@ package net.h4ckx0r.actores; +import net.h4ckx0r.ResourceCache; + import java.awt.*; +import java.awt.image.BufferedImage; public abstract class Actor { int x, y, ancho, alto; + BufferedImage sprite; + boolean frameTerminado = false; - public abstract void paint(Graphics g); + public Actor(int x, int y, int ancho, int alto, String imgName) { + this.x = x; + this.y = y; + this.ancho = ancho; + this.alto = alto; + this.sprite = ResourceCache.getInstance().getImage(imgName); + } + + public void paint(Graphics g) { + g.drawImage(this.sprite, this.x, this.y, this.ancho, this.alto, null); + } public abstract void actua(); @@ -40,4 +55,16 @@ public abstract class Actor { public void setAlto(int alto) { this.alto = alto; } + + public boolean isFrameTerminado() { + return frameTerminado; + } + + public void setFrameTerminado(boolean frameTerminado) { + this.frameTerminado = frameTerminado; + } + + public void colisionaCon(Actor a, Rectangle act1Rectangle, Rectangle act2Rectangle) { + } + } diff --git a/src/main/java/net/h4ckx0r/actores/Jugador.java b/src/main/java/net/h4ckx0r/actores/Jugador.java index 69d05d9..42baba8 100644 --- a/src/main/java/net/h4ckx0r/actores/Jugador.java +++ b/src/main/java/net/h4ckx0r/actores/Jugador.java @@ -11,17 +11,8 @@ public class Jugador extends Actor { private int velocidadX = 4; - public Jugador(int ancho, int alto, int initialX, int initialY) { - this.ancho = ancho; - this.alto = alto; - this.x = initialX; - this.y = initialY; - } - - @Override - public void paint(Graphics g) { - g.setColor(Color.RED); - g.fillRect(this.x, this.y, this.ancho, this.alto); + public Jugador(int ancho, int alto, int initialX, int initialY, String imgName) { + super(initialX, initialY, ancho, alto, imgName); } @Override diff --git a/src/main/java/net/h4ckx0r/actores/Ladrillo.java b/src/main/java/net/h4ckx0r/actores/Ladrillo.java index 881439b..89f27b9 100644 --- a/src/main/java/net/h4ckx0r/actores/Ladrillo.java +++ b/src/main/java/net/h4ckx0r/actores/Ladrillo.java @@ -6,25 +6,14 @@ import java.awt.*; public class Ladrillo extends Actor { - public static Color[] colores = new Color[]{Color.RED, Color.YELLOW, Color.PINK, Color.CYAN, Color.GREEN, Color.ORANGE}; - int fila; - - public Ladrillo(int ancho, int alto, int fila, int columna, int separacion, int separacionSuperior) { - this.setAncho(ancho); - this.setAlto(alto); - this.fila = fila; - - this.x = separacion + (columna * ancho) + (separacion * columna); - this.y = separacion + (fila * alto) + (separacion * fila) + separacionSuperior; + public Ladrillo(int ancho, int alto, int fila, int columna, int separacion, int separacionSuperior, String[] imgNames) { + super(separacion + (columna * ancho) + (separacion * columna), + separacion + (fila * alto) + (separacion * fila) + separacionSuperior, + ancho, alto, imgNames[fila]); } - @Override - public void paint(Graphics g) { - g.setColor(colores[fila]); - g.fillRect(this.x, this.y, this.ancho, this.alto); - } @Override public void actua() { @@ -32,13 +21,9 @@ public class Ladrillo extends Actor { } @Override - public String toString() { - return "Ladrillo{" + - "fila=" + fila + - ", x=" + x + - ", y=" + y + - ", ancho=" + ancho + - ", alto=" + alto + - '}'; + public void colisionaCon(Actor a, Rectangle act1Rectangle, Rectangle act2Rectangle) { + if (a instanceof Pelota) { + Arkanoid.getInstance().eliminaActor(this); + } } } diff --git a/src/main/java/net/h4ckx0r/actores/Pelota.java b/src/main/java/net/h4ckx0r/actores/Pelota.java index ae56645..ed0c2e9 100644 --- a/src/main/java/net/h4ckx0r/actores/Pelota.java +++ b/src/main/java/net/h4ckx0r/actores/Pelota.java @@ -1,34 +1,70 @@ package net.h4ckx0r.actores; import net.h4ckx0r.Arkanoid; +import net.h4ckx0r.ResourceCache; import java.awt.*; +import java.awt.image.BufferedImage; public class Pelota extends Actor { - private static int velocidadX = 5; - private static int velocidadY = 2; + private int velocidadX = 5; + private int velocidadY = 2; - public Pelota(int diametro, int initialX, int initialY) { - this.ancho = diametro; - this.alto = diametro; - this.x = initialX; - this.y = initialY; - } - - public void paint(Graphics g) { - g.setColor(Color.WHITE); - g.fillOval(this.x, this.y, this.ancho, this.alto); + public Pelota(int diametro, int initialX, int initialY, String imgName) { + super(initialX, initialY, diametro, diametro, imgName); } @Override public void actua() { - this.x += Pelota.velocidadX; - this.y += Pelota.velocidadY; + this.x += this.velocidadX; + this.y += this.velocidadY; if (this.x + this.ancho >= Arkanoid.getInstance().getCanvas().getWidth() - || this.x <= 0) Pelota.velocidadX = -Pelota.velocidadX; + || this.x <= 0) this.velocidadX = -this.velocidadX; if (this.y + this.alto >= Arkanoid.getInstance().getCanvas().getHeight() - || this.y <= 0) Pelota.velocidadY = -Pelota.velocidadY; + || this.y <= 0) this.velocidadY = -this.velocidadY; + } + + + public void colisionaCon(Actor a, Rectangle rectPelota, Rectangle rectActor) { + if (a instanceof Jugador) { + Rectangle interseccion = rectPelota.intersection(rectActor); + + if (!interseccion.isEmpty() && !frameTerminado) { + if (interseccion.getWidth() < interseccion.getHeight()) { + this.velocidadX = -this.velocidadX; + } else { + this.velocidadY = -this.velocidadY; + } + frameTerminado = true; + } + + } else if (a instanceof Ladrillo) { + + Rectangle interseccion = rectPelota.intersection(rectActor); + + if (!interseccion.isEmpty() && !frameTerminado) { + if (interseccion.getWidth() < interseccion.getHeight()) { + this.velocidadX = -this.velocidadX; + } else { + this.velocidadY = -this.velocidadY; + } + frameTerminado = true; + } + + } + } + + @Override + public String toString() { + return "Pelota{" + + "velocidadX=" + velocidadX + + ", velocidadY=" + velocidadY + + ", x=" + x + + ", y=" + y + + ", ancho=" + ancho + + ", alto=" + alto + + '}'; } } diff --git a/src/main/resources/images/LadrilloAmarillo.png b/src/main/resources/images/LadrilloAmarillo.png new file mode 100644 index 0000000..b63b5ff Binary files /dev/null and b/src/main/resources/images/LadrilloAmarillo.png differ diff --git a/src/main/resources/images/LadrilloAzul.png b/src/main/resources/images/LadrilloAzul.png new file mode 100644 index 0000000..80ad267 Binary files /dev/null and b/src/main/resources/images/LadrilloAzul.png differ diff --git a/src/main/resources/images/LadrilloAzulOscuro.png b/src/main/resources/images/LadrilloAzulOscuro.png new file mode 100644 index 0000000..c025875 Binary files /dev/null and b/src/main/resources/images/LadrilloAzulOscuro.png differ diff --git a/src/main/resources/images/LadrilloNaranja.png b/src/main/resources/images/LadrilloNaranja.png new file mode 100644 index 0000000..2f41e09 Binary files /dev/null and b/src/main/resources/images/LadrilloNaranja.png differ diff --git a/src/main/resources/images/LadrilloRojo.png b/src/main/resources/images/LadrilloRojo.png new file mode 100644 index 0000000..0095419 Binary files /dev/null and b/src/main/resources/images/LadrilloRojo.png differ diff --git a/src/main/resources/images/LadrilloVerde.png b/src/main/resources/images/LadrilloVerde.png new file mode 100644 index 0000000..83c09c4 Binary files /dev/null and b/src/main/resources/images/LadrilloVerde.png differ diff --git a/src/main/resources/images/Pelota.png b/src/main/resources/images/Pelota.png new file mode 100644 index 0000000..0e68d0e Binary files /dev/null and b/src/main/resources/images/Pelota.png differ diff --git a/src/main/resources/images/Player1.png b/src/main/resources/images/Player1.png new file mode 100644 index 0000000..973152b Binary files /dev/null and b/src/main/resources/images/Player1.png differ diff --git a/src/main/resources/images/Player2.png b/src/main/resources/images/Player2.png new file mode 100644 index 0000000..e8af24a Binary files /dev/null and b/src/main/resources/images/Player2.png differ diff --git a/src/main/resources/images/Player3.png b/src/main/resources/images/Player3.png new file mode 100644 index 0000000..d097b34 Binary files /dev/null and b/src/main/resources/images/Player3.png differ