Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
Binary file modified repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid$1.class
Binary file not shown.
Binary file modified repositorio personal/bin/Juegos/Arkanoid/Codigo/Arkanoid.class
Binary file not shown.
Binary file modified repositorio personal/bin/Juegos/Arkanoid/Codigo/Nave.class
Binary file not shown.
Binary file modified repositorio personal/bin/Juegos/Arkanoid/Codigo/Pelota.class
Binary file not shown.
102 changes: 79 additions & 23 deletions repositorio personal/src/Juegos/Arkanoid/Codigo/Arkanoid.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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
Expand All @@ -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) {
Expand Down
37 changes: 28 additions & 9 deletions repositorio personal/src/Juegos/Arkanoid/Codigo/Nave.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;


/**
Expand All @@ -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
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand All @@ -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; }

Expand All @@ -113,6 +123,15 @@ public void mouseMoved(MouseEvent arg0) {

}

public int getVidas() {
return VIDAS;
}

public void setVidas(int vidas) {
this.VIDAS = vidas;
}


}


50 changes: 16 additions & 34 deletions repositorio personal/src/Juegos/Arkanoid/Codigo/Pelota.java
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand All @@ -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
Expand All @@ -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 <Pelota> vidapelotas = new ArrayList<Pelota>();
public Pelota() {
Expand All @@ -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

}


Expand All @@ -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++;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down