package com.me.adventures.characters; import java.util.ArrayList; import java.util.List; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Animation; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Vector2; import com.me.adventures.main.AdventuresOfManuel; import com.me.adventures.main.Constant; public class Manuel extends PersonajeDelJuego { //Constantes locales public static final int ABAJO = 0; public static final int IZQUIERDA = 1; public static final int DERECHA = 2; public static final int ARRIBA = 3; public static final int SPRITE_QUIETO = 2; // Atributos básicos private BitmapFont font; private int corazonesObtenidos; private List<Proyectil> proyectiles; private boolean disparando; boolean manuelSeQuedaQuieto; private int tiempoParaSiguienteProyectil; // Para que no se disparen dos a la vez private Sound sonidoDisparo; //Atributos para pintar a Manuel private TextureRegion [][] manuelMatrizFrames; private Animation manuelAnimationAbajo, manuelAnimationIzquierda, manuelAnimationDerecha, manuelAnimationArriba; public Manuel(AdventuresOfManuel adventures, Vector2 posicion) { super(adventures, posicion); Textura = adventures.getManager().get("Manolito/TablaSpritesManolitoTransparencia.png", Texture.class); manuelMatrizFrames = TextureRegion.split(Textura, Constant.ANCHURA_PERSONAJE, Constant.ALTURA_PERSONAJE); // Asignamos las animaciones de las direcciones de Manuel manuelAnimationAbajo = new Animation(0.05f, manuelMatrizFrames[ABAJO]); manuelAnimationIzquierda = new Animation(0.05f, manuelMatrizFrames[IZQUIERDA]); manuelAnimationDerecha= new Animation(0.05f, manuelMatrizFrames[DERECHA]); manuelAnimationArriba = new Animation(0.05f, manuelMatrizFrames[ARRIBA]); disparando = false; this.font = new BitmapFont(Gdx.files.internal("arial.fnt"), Gdx.files.internal("arial.png"), false); this.corazonesObtenidos = 0; direccion = ABAJO; proyectiles = new ArrayList<Proyectil>(); tiempoParaSiguienteProyectil = 0; sonidoDisparo = adventures.getManager().get("Musica/DisparoManolito.mp3", Sound.class); } @Override public void draw(SpriteBatch batch) { batch.draw(frameActual, posicion.x, posicion.y, bordes.height, bordes.width); if(disparando) proyectiles.get(0).draw(batch); batch.draw(new TextureRegion(new Texture("Miscelanea/ProyectilManolito.png"), 58, 0, Constant.ANCHURA_PERSONAJE, Constant.ALTURA_PERSONAJE), 930, 522); String numeroProyectiles = Integer.toString(proyectiles.size()); // Mostrar numero de proyectiles font.draw(batch, numeroProyectiles, 947, 500); } @Override public void update() { // Determina movimiento de Manuel boolean soloUnaTeclaPresionada = true; manuelSeQuedaQuieto = false; boolean colisionDerecha = colisiones.colisionDerechaObjeto(this) || colisiones.colisionDerechaEnemigo(this) || colisiones.colisionMovibleDerecha(this); boolean colisionIzquierda = colisiones.colisionIzquierdaObjeto(this) || colisiones.colisionIzquierdaEnemigo(this) || colisiones.colisionMovibleIzquierda(this); boolean colisionArriba = colisiones.colisionArribaObjeto(this) || colisiones.colisionArribaEnemigo(this) || colisiones.colisionMovibleArriba(this); boolean colisionAbajo = colisiones.colisionAbajoObjeto(this) || colisiones.colisionAbajoEnemigo(this) || colisiones.colisionMovibleAbajo(this); if(Gdx.app.getType() == ApplicationType.Desktop) moverDesktop(soloUnaTeclaPresionada, colisionDerecha, colisionIzquierda, colisionArriba, colisionAbajo); else if(Gdx.app.getType() == ApplicationType.Android) moverAndroid(soloUnaTeclaPresionada, colisionDerecha, colisionIzquierda, colisionArriba, colisionAbajo); colisiones.colisionCorazon(this); colisiones.colisionCofre(this); ajustarManuel(colisionDerecha, colisionIzquierda, colisionArriba, colisionAbajo); activarAtaque(); if(disparando) { if(colisiones.colisionDisparoEnemigo(proyectiles.get(0))) eliminandoDisparo(); else if(colisiones.colisionDisparoObjeto(proyectiles.get(0))) eliminandoDisparo(); else proyectiles.get(0).update(); } if(tiempoParaSiguienteProyectil > 0) // Decrementa tiempo misil tiempoParaSiguienteProyectil--; // Actualizar bordes bordes.x = posicion.x; bordes.y = posicion.y; } @Override public void activarAtaque() { if(!proyectiles.isEmpty() && !disparando && teclaDeDisparo() && tiempoParaSiguienteProyectil == 0){ tiempoParaSiguienteProyectil = Constant.TIEMPO_PROYECTIL; //tenemos que pasarle la posicion siguiente a donde este manolito, dependiendo de la direccion proyectiles.get(0).inicializaPosicion(posicion, direccion); disparando = true; if(adventures.isSonidoActivado()) sonidoDisparo.play(); } } private boolean teclaDeDisparo() { if(Gdx.app.getType() == ApplicationType.Desktop) return Gdx.input.isKeyPressed(Keys.SPACE); else if(Gdx.app.getType() == ApplicationType.Android) return Gdx.input.isTouched() && Gdx.input.getX() < (Gdx.graphics.getWidth() / 2) + 150 && Gdx.input.getX() > (Gdx.graphics.getWidth() / 2) - 150 && Gdx.input.getY() < (Gdx.graphics.getHeight() / 2) + 150 && Gdx.input.getY() > (Gdx.graphics.getHeight() / 2) - 150; else return false; } private void eliminandoDisparo() { disparando = false; proyectiles.remove(0); } private void moverDesktop(boolean soloUnaTeclaPresionada, boolean colisionDerecha, boolean colisionIzquierda, boolean colisionArriba, boolean colisionAbajo) { if(Gdx.input.isKeyPressed(Keys.RIGHT)) { if(soloUnaTeclaPresionada && !colisionDerecha) { //posicion.x = posicion.x + Constant.SPEED; posicion.x = (float) (posicion.x + Constant.SPEED); stateTime = stateTime + Gdx.graphics.getDeltaTime(); } soloUnaTeclaPresionada = false; direccion = DERECHA; } else if(Gdx.input.isKeyPressed(Keys.LEFT)) { if(soloUnaTeclaPresionada && !colisionIzquierda) { //posicion.x = posicion.x - Constant.SPEED; posicion.x = (float) (posicion.x - Constant.SPEED); stateTime = stateTime + Gdx.graphics.getDeltaTime(); } soloUnaTeclaPresionada = false; direccion = IZQUIERDA; } else if(Gdx.input.isKeyPressed(Keys.UP)) { if(soloUnaTeclaPresionada && !colisionArriba) { //posicion.y = posicion.y + Constant.SPEED; posicion.y = (float) (posicion.y + Constant.SPEED); stateTime = stateTime + Gdx.graphics.getDeltaTime(); } soloUnaTeclaPresionada = false; direccion = ARRIBA; } else if(Gdx.input.isKeyPressed(Keys.DOWN)) { if(soloUnaTeclaPresionada && !colisionAbajo) { //posicion.y = posicion.y - Constant.SPEED; posicion.y = (float) (posicion.y - Constant.SPEED); stateTime = stateTime + Gdx.graphics.getDeltaTime(); } soloUnaTeclaPresionada = false; direccion = ABAJO; } else manuelSeQuedaQuieto = true; } private void moverAndroid(boolean soloUnaTeclaPresionada, boolean colisionDerecha, boolean colisionIzquierda, boolean colisionArriba, boolean colisionAbajo) { if(Gdx.input.isTouched() && Gdx.input.getX() > Gdx.graphics.getWidth() - 70) { if(soloUnaTeclaPresionada && !colisionDerecha) { posicion.x = (float) (posicion.x + Constant.SPEED); stateTime = stateTime + Gdx.graphics.getDeltaTime(); } soloUnaTeclaPresionada = false; direccion = DERECHA; } else if(Gdx.input.isTouched() && Gdx.input.getX() < 70) { if(soloUnaTeclaPresionada && !colisionIzquierda) { posicion.x = (float) (posicion.x - Constant.SPEED); stateTime = stateTime + Gdx.graphics.getDeltaTime(); } soloUnaTeclaPresionada = false; direccion = IZQUIERDA; } else if(Gdx.input.isTouched() && Gdx.input.getY() < 70) { if(soloUnaTeclaPresionada && !colisionArriba) { posicion.y = (float) (posicion.y + Constant.SPEED); stateTime = stateTime + Gdx.graphics.getDeltaTime(); } soloUnaTeclaPresionada = false; direccion = ARRIBA; } else if(Gdx.input.isTouched() && Gdx.input.getY() > Gdx.graphics.getHeight() - 70) { if(soloUnaTeclaPresionada && !colisionAbajo) { posicion.y = (float) (posicion.y - Constant.SPEED); stateTime = stateTime + Gdx.graphics.getDeltaTime(); } soloUnaTeclaPresionada = false; direccion = ABAJO; } else manuelSeQuedaQuieto = true; } public void ajustarManuel(boolean colisionDerecha, boolean colisionIzquierda, boolean colisionArriba, boolean colisionAbajo) { //Direccion frame Manuel if(direccion == ABAJO) { if(manuelSeQuedaQuieto) { int nuevaPosicion = (int) posicion.y; while(nuevaPosicion % 29 != 0) // Ajusta la posición nuevaPosicion--; posicion.y = nuevaPosicion; frameActual = manuelMatrizFrames[direccion][SPRITE_QUIETO]; } else frameActual = manuelAnimationAbajo.getKeyFrame(stateTime, true); } else if(direccion == IZQUIERDA) { if(manuelSeQuedaQuieto) { int nuevaPosicion = (int) posicion.x; while(nuevaPosicion % 29 != 19) // Ajusta la posición nuevaPosicion--; posicion.x = nuevaPosicion; frameActual = manuelMatrizFrames[direccion][SPRITE_QUIETO]; } else frameActual = manuelAnimationIzquierda.getKeyFrame(stateTime, true); } else if(direccion == DERECHA) { if(manuelSeQuedaQuieto) { int nuevaPosicion = (int) posicion.x; while(nuevaPosicion % 29 != 19) // Ajusta la posición nuevaPosicion++; posicion.x = nuevaPosicion; frameActual = manuelMatrizFrames[direccion][SPRITE_QUIETO]; } else frameActual = manuelAnimationDerecha.getKeyFrame(stateTime, true); } else if(direccion == ARRIBA) { if(manuelSeQuedaQuieto) { int nuevaPosicion = (int) posicion.y; while(nuevaPosicion % 29 != 0) // Ajusta la posición nuevaPosicion++; posicion.y = nuevaPosicion; frameActual = manuelMatrizFrames[direccion][SPRITE_QUIETO]; } else frameActual = manuelAnimationArriba.getKeyFrame(stateTime, true); } if(colisionDerecha || colisionIzquierda || colisionArriba || colisionAbajo) { detectaColisionInminente(); } } private void detectaColisionInminente() { if(colisiones.colisionObjetoEnemigoMovible(this)) { if(direccion == DERECHA) posicion.x -= 29; if(direccion == IZQUIERDA) posicion.x += 29; if(direccion == ARRIBA) posicion.y -= 29; if(direccion == ABAJO) posicion.y += 29; } } // Getters and Setters ------------------------------------------------------------------------ public int getCorazonesObtenidos() { return corazonesObtenidos; } public void obtenerCorazon(){ corazonesObtenidos++; } public void obtenerProyectil(int proyectilesOtorgados){ for(int i = 0; i < proyectilesOtorgados; i++) proyectiles.add(new ProyectilManuel(adventures, new Vector2())); } }