diff --git a/repositorio personal/.settings/org.eclipse.core.resources.prefs b/repositorio personal/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..feae673 --- /dev/null +++ b/repositorio personal/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/Juegos/Arkanoid/Codigo/Arkanoid.java=UTF-8 +encoding//src/Juegos/Arkanoid/Codigo/Nave.java=UTF-8 +encoding//src/Juegos/Arkanoid/Codigo/Pelota.java=UTF-8 diff --git a/repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid$1.class b/repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid$1.class index 37861b8..23daf21 100644 Binary files a/repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid$1.class and b/repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid$1.class differ diff --git a/repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid.class b/repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid.class index f927d75..eebc0e8 100644 Binary files a/repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid.class and b/repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid.class differ diff --git a/repositorio personal/bin/Juegos/Arkanoid/Codigo/Nave.class b/repositorio personal/bin/Juegos/Arkanoid/Codigo/Nave.class index eca91f7..5a3e073 100644 Binary files a/repositorio personal/bin/Juegos/Arkanoid/Codigo/Nave.class and b/repositorio personal/bin/Juegos/Arkanoid/Codigo/Nave.class differ diff --git a/repositorio personal/bin/Juegos/Arkanoid/Codigo/Pelota.class b/repositorio personal/bin/Juegos/Arkanoid/Codigo/Pelota.class index 01788cd..5b6cc97 100644 Binary files a/repositorio personal/bin/Juegos/Arkanoid/Codigo/Pelota.class and b/repositorio personal/bin/Juegos/Arkanoid/Codigo/Pelota.class differ diff --git a/repositorio personal/src/Juegos/Arkanoid/Codigo/Arkanoid.java b/repositorio personal/src/Juegos/Arkanoid/Codigo/Arkanoid.java index 6377800..73f5035 100644 --- a/repositorio personal/src/Juegos/Arkanoid/Codigo/Arkanoid.java +++ b/repositorio personal/src/Juegos/Arkanoid/Codigo/Arkanoid.java @@ -48,15 +48,19 @@ public class Arkanoid extends Canvas { Nave nave = null; - // Velocidad de los fotogramas, en concreto este indica que el proceso de redibujado dormirá 10 millis + // Velocidad de los fotogramas, en concreto este indica que el proceso de redibujado dormirá 10 millis // tras haber repintado la escena public static final int SPEED_FPS=60; - // BufferStrategy usado para conseguir la técnica de doble búffer + // BufferStrategy usado para conseguir la técnica de doble búffer public BufferStrategy strategy; - private long usedTime; // Tiempo usado en cada iteración del bucle principal del juego. + private long usedTime; // Tiempo usado en cada iteración del bucle principal del juego. public HashMap sprites; public int posX,posY,vX; + // Para establecer el lugar que ocupa la barra de estado, necesitamos tener una + // referencia de hasta d�nde llega + // la zona vertical de juego y d�nde empieza la barra de estado + private int YforStatusBar = 0; public Arkanoid() { sprites = new HashMap(); @@ -114,10 +118,14 @@ public void paintWorld() { //g.drawImage(nave, 230, 600, null); for (Objeto ladrillo : objetos) { ladrillo.paint(g); - } + } + // Pinto la barra de estado, para lo que necesito conocer el alto del juego + YforStatusBar = this.getHeight() - 22; // le doy la altura del camvas - 12 para dejarl las vidas abajo a la + // izquierda + this.pintaVidas(g); + nave.paint(g); pelota.paint(g); - pelota.paintImagenDeVidas(g); pelota.paintImagenDeGameOver(g); strategy.show(); @@ -217,38 +225,38 @@ public void updateWorld() { actorsForRemoval.add(actor); } } - // Elimino los actores marcados para su eliminación + // Elimino los actores marcados para su eliminación for (Objeto actor : actorsForRemoval) { this.objetos.remove(actor); } // Limpio la lista de actores para eliminar actorsForRemoval.clear(); - // Además de eliminar actores, también puede haber actores nuevos que se deban insertar en la siguiente iteración. - // Se insertan y después se limpia la lista de nuevos actores a insertar + // Además de eliminar actores, también puede haber actores nuevos que se deban insertar en la siguiente iteración. + // Se insertan y después se limpia la lista de nuevos actores a insertar this.objetos.addAll(newActorsForNextInteration); this.newActorsForNextInteration.clear(); - // Finalmente, se llama al método "act" de cada actor, para que cada uno recalcule por si mismo sus valores. + // Finalmente, se llama al método "act" de cada actor, para que cada uno recalcule por si mismo sus valores. for (Objeto actor : this.objetos) { actor.act(); } boolean yaHaColisionado = false; // Una vez que cada actor ha actuado, intento detectar colisiones entre los actores y notificarlas. Para detectar - // estas colisiones, no nos queda más remedio que intentar detectar la colisión de cualquier actor con cualquier otro - // sólo con la excepción de no comparar un actor consigo mismo. - // La detección de colisiones se va a baser en formar un rectángulo con las medidas que ocupa cada actor en pantalla, - // De esa manera, las colisiones se traducirán en intersecciones entre rectángulos. + // estas colisiones, no nos queda más remedio que intentar detectar la colisión de cualquier actor con cualquier otro + // sólo con la excepción de no comparar un actor consigo mismo. + // La detección de colisiones se va a baser en formar un rectángulo con las medidas que ocupa cada actor en pantalla, + // De esa manera, las colisiones se traducirán en intersecciones entre rectángulos. for (Objeto actor1 : this.objetos) { - // Creo un rectángulo para este actor. + // Creo un rectángulo para este actor. Rectangle rect1 = new Rectangle(actor1.getxCoord(), actor1.getyCoord(), actor1.getAncho(), actor1.getAlto()); // Compruebo un actor con cualquier otro actor for (Objeto actor2 : this.objetos) { - // Evito comparar un actor consigo mismo, ya que eso siempre provocaría una colisión y no tiene sentido + // Evito comparar un actor consigo mismo, ya que eso siempre provocaría una colisión y no tiene sentido if (!actor1.equals(actor2)) { - // Formo el rectángulo del actor 2 + // Formo el rectángulo del actor 2 Rectangle rect2 = new Rectangle(actor2.getxCoord(), actor2.getyCoord(), actor2.getAncho(), actor2.getAlto()); - // Si los dos rectángulos tienen alguna intersección, notifico una colisión en los dos actores + // Si los dos rectángulos tienen alguna intersección, notifico una colisión en los dos actores if (rect1.intersects(rect2)) { actor1.collisionWith(actor2); // El actor 1 colisiona con el actor 2 actor2.collisionWith(actor1); // El actor 2 colisiona con el actor 1 @@ -262,23 +270,71 @@ public void updateWorld() { } - + /** + * M�todo en el cual pintamos las vidas + * + * @param g + */ + public void pintaVidas(Graphics2D g) { + int xBase = 5 + Nave.VIDAS; // posici�n de la coordenada X de cada vida (4 en nuestro caso) + for (int i = 0; i < nave.getVidas(); i++) { + BufferedImage vidas = SpriteRepository.getInstance().getSprite("nave-25x7.png"); + g.drawImage(vidas, xBase + i * vidas.getWidth(), YforStatusBar, this); // pintado de las vidas + + } + } + + /** + * Con este m�todo restamos las vidas y devolvemos la bola al incio pegada a la + * nave + */ + public void restarVida() { + if (Nave.getInstance().VIDAS > 0) { + Nave.getInstance().VIDAS--; + // m�todo que est� en clase pelota con el que reiniciamos la bola desde el inicio + pelota.reiniciarMillis(); + + } + if(Nave.getInstance().VIDAS == 0) { + pelota.setMarkedForRemoval(true); + } + + } + + + /** + * M�todo en el cual incluimos el m�todo anterior para luego llamarlo en el + * paintWorld principal + * + * @param g + */ + + public void paintStatus(Graphics2D g) { + pintaVidas(g); + } public void game() { - // Inicialización del juego + // Inicialización del juego initWorld(); - // El bucle se ejecutará mientras el objeto Canvas sea visible + // El bucle se ejecutará mientras el objeto Canvas sea visible while (isVisible()) { long startTime = System.currentTimeMillis(); // Tomo el tiempo, en millis, antes de crear el siguiente Frame del juego // actualizo y pinto la escena updateWorld(); paintWorld(); - // Calculo el tiempo que se ha tardado en la ejecución + // Calculo el tiempo que se ha tardado en la ejecución usedTime = System.currentTimeMillis() - startTime; + + // Con esta condici�n le indicamos a la bola que cuando salga del Canvas por + // abajo, act�e el m�todo de restar vidas y reiniciar la bola + if (pelota.getyCoord() > Arkanoid.getInstace().HEIGHT) { + restarVida(); + + } // Hago que el bucle pare una serie de millis, antes de generar el siguiente FPS - // El cálculo hecho "duerme" el proceso para no generar más de los SPEED_FPS que - // se haya específicado + // El cálculo hecho "duerme" el proceso para no generar más de los SPEED_FPS que + // se haya específicado try { int millisToSleep = (int) (1000 / SPEED_FPS - usedTime); if (millisToSleep < 0) { diff --git a/repositorio personal/src/Juegos/Arkanoid/Codigo/Nave.java b/repositorio personal/src/Juegos/Arkanoid/Codigo/Nave.java index cf45606..c2b0c9f 100644 --- a/repositorio personal/src/Juegos/Arkanoid/Codigo/Nave.java +++ b/repositorio personal/src/Juegos/Arkanoid/Codigo/Nave.java @@ -10,11 +10,13 @@ public class Nave extends Objeto implements KeyListener, MouseMotionListener{ - // Propiedades específicas del jugador - protected int vx; // Cantidad de píxeles que aumentará la posición del jugador en cada iteración del bucle principal del juego - private boolean left,right; // Booleanas que determinan si el player se está moviendo actualmente + // Propiedades específicas del jugador + protected int vx; // Cantidad de píxeles que aumentará la posición del jugador en cada iteración del bucle principal del juego + private boolean left,right; // Booleanas que determinan si el player se está moviendo actualmente protected static final int PLAYER_SPEED = 4; // velocidad del movimiento de la nave en los dos ejes private BufferedImage imagenDeNave; + protected static int VIDAS = 4; //n�mero de vidas M�XIMAS iniciales que va a tener el jugador + public static Nave instance = null; /** @@ -30,12 +32,20 @@ public void ajustarAnchoAlto() { this.alto = this.imagenDeNave.getHeight(); } + + public static Nave getInstance() { + if (instance == null) { + instance = new Nave(); + } + return instance; + } + /** - * Método necesario para extender de Actor, incorpora el movimiento que el actor realizará en cada iteración del programa + * Método necesario para extender de Actor, incorpora el movimiento que el actor realizará en cada iteración del programa */ @Override public void act() { - //la nave solo se mover� sobre el eje x + //la nave solo se mover� sobre el eje x this.xCoord += this.vx; //limitacion del movimiento de la nave de manera que si llega a los bordes de la ventana no salga de la pantalla @@ -65,7 +75,7 @@ public void keyPressed(KeyEvent e) { } /** - * Cuando una tecla se libera se desactiva la bandera booleana que se había activado al pulsarla + * Cuando una tecla se libera se desactiva la bandera booleana que se había activado al pulsarla */ @Override public void keyReleased(KeyEvent e) { @@ -77,13 +87,13 @@ public void keyReleased(KeyEvent e) { } /** - * Este método no se utiliza pero es necesario implementarlo por el KeyListener + * Este método no se utiliza pero es necesario implementarlo por el KeyListener */ @Override public void keyTyped(KeyEvent e) {} /** - * En función de las banderas booleanas de movimiento, actualizamos las velocidades en los dos ejes + * En función de las banderas booleanas de movimiento, actualizamos las velocidades en los dos ejes */ protected void updateSpeed() { vx=0; @@ -92,7 +102,7 @@ protected void updateSpeed() { } - // Métodos Getters y Setters + // Métodos Getters y Setters public int getVx() { return vx; } public void setVx(int vx) { this.vx = vx; } @@ -113,6 +123,15 @@ public void mouseMoved(MouseEvent arg0) { } + public int getVidas() { + return VIDAS; + } + + public void setVidas(int vidas) { + this.VIDAS = vidas; + } + + } diff --git a/repositorio personal/src/Juegos/Arkanoid/Codigo/Pelota.java b/repositorio personal/src/Juegos/Arkanoid/Codigo/Pelota.java index 8c3752a..43b561e 100644 --- a/repositorio personal/src/Juegos/Arkanoid/Codigo/Pelota.java +++ b/repositorio personal/src/Juegos/Arkanoid/Codigo/Pelota.java @@ -9,6 +9,7 @@ import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.util.ArrayList; +import java.util.Date; import java.util.List; public class Pelota extends Objeto implements KeyListener, MouseListener{ @@ -19,7 +20,7 @@ public class Pelota extends Objeto implements KeyListener, MouseListener{ protected static final int PLAYER_SPEED = 4; private int contador = 0; //Contador para cada una de las vidas de la pelota - private int contadorVidas = 0; + private int Vidas = 0; //Variable ficticia para medir el tiempo private long usedTime; //Variable con la que empieza a contar el tiempo en milis @@ -32,6 +33,8 @@ public class Pelota extends Objeto implements KeyListener, MouseListener{ private float distancia = 3; private BufferedImage imagenDeGameOver; private BufferedImage ImagenDeVidas; + TrayectoriaRecta trayectoria = null; + private long millisEnInicio = 0; // inicio del tiempo en millisegundos //Creamos una lista para cada una de las vidas de la pelota public List vidapelotas = new ArrayList(); public Pelota() { @@ -41,7 +44,9 @@ public Pelota() { this.ancho = 15; this.vx = 0; this.vy = 0; - + this.millisEnInicio = new Date().getTime(); // Esto nos da el tiempo desde 0 en adelante, empieza a contar desde + // que se crea la pelota + } @@ -56,7 +61,7 @@ public void act() { //Luego ejecutamos el systemcurrentmillis para que vaya sumando todo el rato milesimas desde 1970 luego la diferencia de la que va sumando todo el rato //menos la fija de antes tiene que llegarnos a 5000 usedTime = System.currentTimeMillis() - startTime; - if (usedTime >= 5000 && contadortiempo == 0 && contador == 0 && contadorVidas <= 4) { + if (usedTime >= 5000 && contadortiempo == 0 && contador == 0 && Vidas <= 4) { //Este contador que utilizo para que la pelota no siga sumando velocidad //en el used time contadortiempo++; @@ -95,39 +100,16 @@ public void act() { p = t.getPuntoADistanciaDePunto(p, distancia); this.xCoord = Math.round(p.x); this.yCoord = Math.round(p.y); - - if(yCoord >= (Arkanoid.getInstace().getHeight())){ - //Contador para cada una de las vidas de la pelota - contadorVidas++; - //Como inicio es falso la pelota aparece donde la nave - //pero como tenemos 4 vidas tenemos un limite de 4 - if(contadorVidas == 4) { - //Pintamos el gameover - this.imagenDeGameOver = SpriteRepository.getInstance().getSprite("game-over.png"); - }else { - inicio = false; - } - //Restablecemos cada uno de los contadores de tiempo y de space y raton - contadortiempo = 0; - contador = 0; - //Restablecemos el startTime - startTime = System.currentTimeMillis(); - } - - - this.ImagenDeVidas = SpriteRepository.getInstance().getSprite("nave-25x7.png"); - } } - public void paintImagenDeVidas(Graphics g) { - int CoordenadaX = 20; - int variable = 4; - for(int i = 4; i < 5 && i > 0;i--) { - g.drawImage(ImagenDeVidas, CoordenadaX, 650, null); - CoordenadaX += 30; - } + /** + * M�todo que nos reinicia la salida de la bola cuando sale del Canvas, reininica los millis y vuelve la trayectoria a null + */ + public void reiniciarMillis() { + millisEnInicio = new Date().getTime(); + trayectoria = null; } public void paintImagenDeGameOver(Graphics g) { @@ -160,7 +142,7 @@ public void collisionWith(Objeto actorCollisioned) { @Override public void mouseClicked(MouseEvent e) { - if(contador == 0 && contadorVidas <= 4) { + if(contador == 0 && Vidas <= 4) { primerPunto(); inicio = true; } @@ -216,7 +198,7 @@ public void keyReleased(KeyEvent e) { } protected void updateSpeed() { - if(contador == 0 && contadorVidas <= 4) { + if(contador == 0 && Vidas <= 4) { if (space) { primerPunto(); inicio = true;