From 497b40a6e7cda1e08304d8bc9784e441af9ea016 Mon Sep 17 00:00:00 2001 From: h4ckx0r Date: Thu, 6 Feb 2025 19:48:44 +0100 Subject: [PATCH] Versiones 1, 2 y 3 --- .gitignore | 38 ++++ .idea/.gitignore | 3 + .idea/encodings.xml | 7 + .idea/misc.xml | 13 ++ .idea/uiDesigner.xml | 124 ++++++++++++ .idea/vcs.xml | 6 + pom.xml | 17 ++ src/main/java/net/h4ckx0r/Arkanoid.java | 185 ++++++++++++++++++ src/main/java/net/h4ckx0r/MiCanvas.java | 25 +++ src/main/java/net/h4ckx0r/actores/Actor.java | 43 ++++ .../java/net/h4ckx0r/actores/Jugador.java | 45 +++++ .../java/net/h4ckx0r/actores/Ladrillo.java | 44 +++++ src/main/java/net/h4ckx0r/actores/Pelota.java | 34 ++++ 13 files changed, 584 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 pom.xml create mode 100644 src/main/java/net/h4ckx0r/Arkanoid.java create mode 100644 src/main/java/net/h4ckx0r/MiCanvas.java create mode 100644 src/main/java/net/h4ckx0r/actores/Actor.java create mode 100644 src/main/java/net/h4ckx0r/actores/Jugador.java create mode 100644 src/main/java/net/h4ckx0r/actores/Ladrillo.java create mode 100644 src/main/java/net/h4ckx0r/actores/Pelota.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..523e9cd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..39d3b11 --- /dev/null +++ b/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + net.h4ckx0r + Arkanoid + 1.0-SNAPSHOT + + + 23 + 23 + UTF-8 + + + \ No newline at end of file diff --git a/src/main/java/net/h4ckx0r/Arkanoid.java b/src/main/java/net/h4ckx0r/Arkanoid.java new file mode 100644 index 0000000..792b0a1 --- /dev/null +++ b/src/main/java/net/h4ckx0r/Arkanoid.java @@ -0,0 +1,185 @@ +package net.h4ckx0r; + +import net.h4ckx0r.actores.Actor; +import net.h4ckx0r.actores.Jugador; +import net.h4ckx0r.actores.Ladrillo; +import net.h4ckx0r.actores.Pelota; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class Arkanoid { + + private static Arkanoid instance = null; + + private static int altoVentana = 700; + + //Para ajustar el ancho de la ventana usar estos valores + private static int anchoLadrillos = 40; + private static int numLadrillosPorLinea = 10; + private static int separacionBloques = 4; + + //No tocar el ancho + private static int anchoVentana = separacionBloques + ((anchoLadrillos + separacionBloques) * numLadrillosPorLinea); + + private List actores = crearActores(); + private JFrame ventana = new JFrame("Arkanoid - Natanael Gómez Ortiz"); + private MiCanvas canvas = new MiCanvas(actores); + + private boolean pausado = false; + + public Arkanoid() { + + ventana.setBounds(100, 100, anchoVentana, altoVentana); + ventana.getContentPane().setLayout(new BorderLayout()); + ventana.getContentPane().add(canvas, BorderLayout.CENTER); + ventana.setResizable(false); + ventana.setIgnoreRepaint(true); + + ventana.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + ventana.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + super.windowClosing(e); + cerrarVentana(); + } + }); + + + canvas.addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseMoved(MouseEvent e) { + super.mouseMoved(e); + Jugador j = (Jugador) actores.getFirst(); + j.movimientoRaton(e.getX(), e.getY()); + } + + @Override + public void mouseDragged(MouseEvent e) { + super.mouseDragged(e); + mouseMoved(e); + } + }); + + canvas.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + super.keyPressed(e); + if (e.getKeyCode() == KeyEvent.VK_LEFT) { + Jugador j = (Jugador) actores.getFirst(); + j.movimientoTecladoIzquierda(true); + } + if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + Jugador j = (Jugador) actores.getFirst(); + j.movimientoTecladoDerecha(true); + } + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + cerrarVentana(); + } + } + + @Override + public void keyReleased(KeyEvent e) { + super.keyReleased(e); + if (e.getKeyCode() == KeyEvent.VK_LEFT) { + Jugador j = (Jugador) actores.getFirst(); + j.movimientoTecladoIzquierda(false); + } + if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + Jugador j = (Jugador) actores.getFirst(); + j.movimientoTecladoDerecha(false); + } + } + }); + + + ventana.setVisible(true); + canvas.requestFocus(); + } + + public static Arkanoid getInstance() { + if (instance == null) instance = new Arkanoid(); + return instance; + } + + + 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 diametroPelota = 20; + actores.add(new Pelota(diametroPelota, (anchoVentana - diametroPelota) / 2, 400)); + + + for (int i = 0; i < Ladrillo.colores.length; i++) { + for (int j = 0; j < numLadrillosPorLinea; j++) { + actores.add(new Ladrillo(anchoLadrillos, 10, i, j, separacionBloques)); + } + } + + + return actores; + } + + public void bucleJuego() { + int FPS = 60; + int milisegundosPorFrame = 1000 / FPS; + + + while (true) { + long tiempoInicio = new Date().getTime(); + + if (!pausado) { + for (Actor actor : actores) { + actor.actua(); + } + + canvas.repaint(); + } + + 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() { + Arkanoid.getInstance().pausado = true; + int eleccion = JOptionPane.showOptionDialog(Arkanoid.getInstance().ventana, "¿Quiere cerrar el juego?", "Salir de Arkanoid", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[]{"Aceptar", "Cancelar"}, "Cancelar"); + if (eleccion == 0) { + System.exit(0); + } else { + Arkanoid.getInstance().pausado = false; + } + } + + public static void main(String[] args) { + Arkanoid.getInstance().bucleJuego(); + } + + + public MiCanvas getCanvas() { + return canvas; + } + + public static int getAltoVentana() { + return altoVentana; + } + + public static int getAnchoVentana() { + return anchoVentana; + } +} \ No newline at end of file diff --git a/src/main/java/net/h4ckx0r/MiCanvas.java b/src/main/java/net/h4ckx0r/MiCanvas.java new file mode 100644 index 0000000..e1722fa --- /dev/null +++ b/src/main/java/net/h4ckx0r/MiCanvas.java @@ -0,0 +1,25 @@ +package net.h4ckx0r; + +import net.h4ckx0r.actores.Actor; + +import java.awt.*; +import java.util.List; + +public class MiCanvas extends Canvas { + List actores = null; + + public MiCanvas(List actores) { + this.actores = actores; + } + + @Override + public void paint(Graphics g) { + this.setBackground(Color.BLACK); + + for (Actor actor : actores) { + actor.paint(g); + } + } + + +} diff --git a/src/main/java/net/h4ckx0r/actores/Actor.java b/src/main/java/net/h4ckx0r/actores/Actor.java new file mode 100644 index 0000000..1d2ba8e --- /dev/null +++ b/src/main/java/net/h4ckx0r/actores/Actor.java @@ -0,0 +1,43 @@ +package net.h4ckx0r.actores; + +import java.awt.*; + +public abstract class Actor { + int x, y, ancho, alto; + + public abstract void paint(Graphics g); + + public abstract void actua(); + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public int getAncho() { + return ancho; + } + + public void setAncho(int ancho) { + this.ancho = ancho; + } + + public int getAlto() { + return alto; + } + + public void setAlto(int alto) { + this.alto = alto; + } +} diff --git a/src/main/java/net/h4ckx0r/actores/Jugador.java b/src/main/java/net/h4ckx0r/actores/Jugador.java new file mode 100644 index 0000000..ae8243a --- /dev/null +++ b/src/main/java/net/h4ckx0r/actores/Jugador.java @@ -0,0 +1,45 @@ +package net.h4ckx0r.actores; + +import net.h4ckx0r.Arkanoid; + +import java.awt.*; + +public class Jugador extends Actor { + + private boolean movIzq = false; + private boolean movDer = false; + + 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); + } + + @Override + public void actua() { + if (movIzq && this.x > 0) this.x -= velocidadX; + if (movDer && this.x + this.ancho < Arkanoid.getAnchoVentana()) this.x += velocidadX; + } + + public void movimientoRaton(int x, int y) { + x = (x - ancho / 2); + + if (x > 0 && x < Arkanoid.getAnchoVentana() - this.ancho) this.x = x; + } + + public void movimientoTecladoDerecha(boolean derecha) { + this.movDer = derecha; + } + public void movimientoTecladoIzquierda(boolean izquierda) { + this.movIzq = izquierda; + } +} diff --git a/src/main/java/net/h4ckx0r/actores/Ladrillo.java b/src/main/java/net/h4ckx0r/actores/Ladrillo.java new file mode 100644 index 0000000..91d633f --- /dev/null +++ b/src/main/java/net/h4ckx0r/actores/Ladrillo.java @@ -0,0 +1,44 @@ +package net.h4ckx0r.actores; + +import net.h4ckx0r.Arkanoid; + +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) { + this.setAncho(ancho); + this.setAlto(alto); + this.fila = fila; + + this.x = separacion + (columna * ancho) + (separacion * columna); + this.y = separacion + (fila * alto) + (separacion * fila) + (Arkanoid.getAltoVentana()/12); + } + + @Override + public void paint(Graphics g) { + g.setColor(colores[fila]); + + g.fillRect(this.x, this.y, this.ancho, this.alto); + } + + @Override + public void actua() { + + } + + @Override + public String toString() { + return "Ladrillo{" + + "fila=" + fila + + ", x=" + x + + ", y=" + y + + ", ancho=" + ancho + + ", alto=" + alto + + '}'; + } +} diff --git a/src/main/java/net/h4ckx0r/actores/Pelota.java b/src/main/java/net/h4ckx0r/actores/Pelota.java new file mode 100644 index 0000000..ae56645 --- /dev/null +++ b/src/main/java/net/h4ckx0r/actores/Pelota.java @@ -0,0 +1,34 @@ +package net.h4ckx0r.actores; + +import net.h4ckx0r.Arkanoid; + +import java.awt.*; + +public class Pelota extends Actor { + + private static int velocidadX = 5; + private static 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); + } + + @Override + public void actua() { + this.x += Pelota.velocidadX; + this.y += Pelota.velocidadY; + + if (this.x + this.ancho >= Arkanoid.getInstance().getCanvas().getWidth() + || this.x <= 0) Pelota.velocidadX = -Pelota.velocidadX; + if (this.y + this.alto >= Arkanoid.getInstance().getCanvas().getHeight() + || this.y <= 0) Pelota.velocidadY = -Pelota.velocidadY; + } +}