package com.me.invaders.charapters; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture.TextureFilter; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.me.invaders.spaceInvaders; public class Ship { private static final float SPEED = 20; // Velocidad de movimiento de la nave. private static final float MARGEN_IZQUIERDO = 10; // Margen izquierdo que no puede pasar la nave. private static final float MARGEN_DERECHO = Gdx.graphics.getWidth() - 10; // Margen derecho que no puede pasar la nave. private Texture texturaShip; private Vector2 posicion; private float anchura, altura; private Rectangle bordes; public Ship(spaceInvaders invaders, Vector2 posicion) { texturaShip = invaders.getManager().get("data/ship.png", Texture.class); texturaShip.setFilter(TextureFilter.Linear, TextureFilter.Linear); this.posicion = posicion; this.anchura = texturaShip.getWidth(); this.altura = texturaShip.getHeight(); bordes = new Rectangle(posicion.x, posicion.y, anchura, altura); } public void draw(SpriteBatch batch) { // Dibuja la nave batch.draw(texturaShip, posicion.x, posicion.y, anchura, altura); } public boolean update() { // Funcion que se ejecuta en Render de GameScren, y son las opciones que puede tener la nave boolean disparo = false; if(Gdx.app.getType() == ApplicationType.Desktop) // Si estamos jugando en nuestro ordenador disparo = entradaDesktop(); else if(Gdx.app.getType() == ApplicationType.Android) // Si se esta ejecutando en android disparo = entradaAndroid(); // Actualizamos los bordes (la anchura y altura ya se definen en el constructor de Entidad bordes.x = posicion.x; bordes.y = posicion.y; return disparo; // Devuelve true si ha disparado la nave. } private boolean entradaDesktop() { // Acciones de la nave en Desktop if(Gdx.input.isKeyPressed(Keys.RIGHT) && NoChoqueBordeDerecha()) posicion.x = posicion.x + SPEED;// a la posicion en x le sumo la velocidad que hemos determinado por SPEED. if(Gdx.input.isKeyPressed(Keys.LEFT) && NoChoqueBordeIzquierda()) posicion.x = posicion.x - SPEED; // lo mismo pero restandole, ya que vamos a la izquierda //Si se dispara if(Gdx.input.isKeyPressed(Keys.SPACE)) return true; else return false; } private boolean entradaAndroid() { // Acciones de la nave en Android if(Gdx.input.isTouched()) { // Si se da con el dedo en la pantalla if(Gdx.input.getX() < MARGEN_IZQUIERDO) // Si se pasa de la pantalla por la izquierda posicion.x = MARGEN_IZQUIERDO; else if(Gdx.input.getX() + anchura > MARGEN_DERECHO) // Si se pasa de la pantalla por la derecha posicion.x = MARGEN_DERECHO - anchura; else posicion.x = Gdx.input.getX() - (anchura / 2); } //Si se dispara if(Gdx.input.isTouched(1)) // Si se da con un segundo dedo en la pantalla return true; else return false; } private boolean NoChoqueBordeDerecha() { // Permite que la nave no siga avanzando y salirse de la pantalla por la derecha. return posicion.x + anchura < MARGEN_DERECHO; } private boolean NoChoqueBordeIzquierda() { // Permite que la nave no siga avanzando y salirse de la pantalla por la izquierda. return posicion.x > MARGEN_IZQUIERDO; } public boolean tocadoPorDisparo(Shot disparo) { return colisiona(bordes, disparo.getBordes()); } private boolean colisiona(Rectangle a, Rectangle b) { return a.overlaps(b); // la funcion overlaps nos devuelve verdadero si dos rectangulos se solapan. } public void volverAPosicionInicial() { // Método que devuelve la nave a su posición inicial. posicion.x = 10; posicion.y = 10; } // Getters ----------------------------------- public static float getSpeed() { return SPEED; } public Vector2 getPosicion() { return posicion; } public float getAnchura() { return anchura; } public float getAltura() { return altura; } public Rectangle getBordes() { return bordes; } }