Anuncios

Bienvenidos sean a este post, en los dos posts anteriores estuvimos discutiendo como seria la mejor forma de manejar a nuestros elementos en el juego y llegamos a la conclusion de que nuestros objetos deben construirse de una seleccion de componentes.

Anuncios
Anuncios

Esto nos facilita nuestra tarea porque la mayoria de la veces los componentes seran unicos para un objeto especifico del juego pero la mayoria de las veces los componentes seran utilizados en multiples y diferentes objetos del juego, asi que debemos tener una manera de especificar un objeto del juego asi la clase de fabrica sabe cuales componentes corresponden para construir cada uno, para este caso implementaremos una clase de especificaciones padre de la cual todas las otras especificaciones pueden derivarse y asi poder usarlas de manera polimorfica y no tener que construir una fabrica diferente o multiples metodos dentro de una fabrica por cada tipo de objeto.

Anuncios

Para este caso vamos a crear una nueva clase en nuestro proyecto con los siguientes parametros:

  • Nombre: ObjetoEspec
  • Tipo: Class
Anuncios

Una vez creada nuestra clase debemos cambiar el codigo generado automaticamente por el siguiente:

package org.example.invasores;

import android.graphics.PointF;

abstract class ObjetoEspec {
    private String mTag;
    private String mBitmapNombre;
    private float mVelocidad;
    private PointF mEscalaTamano;
    private String[] mComponentes;

    ObjetoEspec(String tag,
                String bitmapNombre,
                float velocidad,
                PointF escalaRelativa,
                String[] componentes){
        mTag = tag;
        mBitmapNombre = bitmapNombre;
        mVelocidad = velocidad;
        mEscalaTamano = escalaRelativa;
        mComponentes = componentes;
    }

    String getTag(){
        return mTag;
    }

    String getBitmapNombre(){
        return mBitmapNombre;
    }

    float getVelocidad(){
        return mVelocidad;
    }

    PointF getEscala(){
        return mEscalaTamano;
    }

    String[] getComponentes(){
        return mComponentes;
    }
}
Anuncios
Anuncios

La primera cosa extraña que vemos en esta clase es que no es publica ni privada sino abstracta, esto lo hacemos asi porque no haremos ninguna instancia desde esta clase sino que simplemente la usaremos como clase base/padre para el resto de las que iremos generando, lo primero que crearemos seran cinco variables/objetos para poder enviar a nuestras clases hijas.

La primera, mTag, sera para identificar a nuestra especificacion cada vez que nuestra fabrica pase a nuestras instancias de GameObjeto permitiendo asi a la clase FisicasEngine encargarse de manejar las colisiones, es decir que esta variable servira como etiqueta e identificara si es un enemigo, el jugador, un laser o el fondo, la siguiente variable almacenara el nombre del bitmap (imagen) que representara a dicho elemento en el recurso drawable, tal como vinimos trabajando hasta ahora pero en lugar de pasarlo en forma literal lo haremos por variable, la siguiente variable sera la velocidad de dicho elemento, despues tendremos una para el tamaño de la misma y el ultimo sera un array que contendra todos los elementos en nuestro juego.

Anuncios
Nota: La variable del tamaño de pantalla debemos usarlo de esta manera porque usamos coordenadas de pantalla en lugar de coordenadas de mundo, lo cual escalara correctamente a todos los elementos en los distintos tamaños de pantalla pero este concepto lo analizaremos en el proximo proyecto.
Anuncios
Anuncios

Lo siguiente es el constructor, en los argumentos tendremos la misma cantidad de elementos que las variables definidas previamente, lo siguiente sera asignar cada uno de los datos recibidos a las variables para iniciarlas, por ultimo tenemos los metodos getter para recuperar los valores de cada una de las variables, con esto concluimos nuestra clase base para nuestro siguiente paso sera la creacion de cada una de las clases que se encargaran de crear los elementos por medio de las especificaciones.

Anuncios
Nota: Las clases van a ser similares entre si, por no decir que la base va a ser la misma, pero lo que mas va a variar es el tema de los componentes y hablaremos sobre ello.
Anuncios

Por cada una debemos generar una clase nueva tal como vinimos haciendo hasta ahora, en todos los casos van a ser clases y en Nombre le deben asignar el que figura antes del codigo, el codigo que le sigue sera el encargado de reemplazar al generado automaticamente, comencemos con el primero:

AlienChaserEspec

package org.example.invasores;

import android.graphics.PointF;

class AlienChaserEspec extends ObjetoEspec {
    private static final String tag = "alien";
    private static final String bitmapNombre = "alien_ship1";
    private static final float velocidad = 4f;
    private static final PointF escalaRelativa =
            new PointF(15f,15f);
    private static final String[] componentes = new String[]{
            "ComponentesGraficosStd",
            "ComponenteAlienChaserMovimiento",
            "ComponenteGeneraAlienHorizontal"};

    AlienChaserEspec(){
        super(tag, bitmapNombre,
                velocidad,
                escalaRelativa,
                componentes);
    }
}
Anuncios
Anuncios

Esta clase sera de tipo privada, lo primero que hacemos es convertirla en heredera de ObjetoEspec, nuestro siguiente paso sera crear las mismas cinco variables de nuestra clase Padre, en la primera identificaremos que es tipo “alien” mediante tag, luego pasamos que imagen debera usar desde el recurso drawable, lo siguiente es la velocidad de nuestro objeto, recuerden que la f es para indicarle que es de tipo float sino lo tomara como double, despues crearemos nuestro objeto para la escala relativa para finalmente crear un array con los componentes que tendran, en este caso tendremos solamente tres de los cuales hablaremos mas tarde, por ultimo tenemos el constructor de la clase que lo unico que hace es enviar los valores de nuestras variables al constructor de la clase base mediante super, las variables en esta y en las proximas clases las hemos hecho de tipo final, es decir constantes, porque se mantendran con el mismo valor durante todo el programa y debemos evitar que se modifiquen bajo cualquier circunstancia, tambien las hemos hecho de tipo static para que esten fijas en esta clase, el tipo es igual a la clase base para que al enviarlas por medio de super no nos genere ningun error, con todo esto comentado vamos a pasar a nuestra siguiente clase.

Anuncios

AlienDiverEspec

package org.example.invasores;

import android.graphics.PointF;

class AlienDiverEspec extends ObjetoEspec {
    private static final String tag = "alien";
    private static final String bitmapNombre = "alien_ship3";
    private static final float velocidad = 4f;
    private static final PointF escalaRelativa =
            new PointF(60f,30f);
    private static final String[] componentes = new String[]{
            "ComponentesGraficosStd",
            "ComponenteAlienDiverMovimiento",
            "ComponenteGeneraAlienVertical"};

    AlienDiverEspec(){
        super(tag, bitmapNombre,
                velocidad,
                escalaRelativa,
                componentes);
    }
}
Anuncios

En este caso podemos ver que la clase es muy similar a la anterior tanto para la herencia como para las variables que va a manejar pasando por el constructor pero la unica diferencia va a estar en los componentes donde se mantiene uno pero varian dos con respecto al anterior pero como dije anteriormente luego hablaremos sobre los componentes, pasemos a la siguiente clase.

Anuncios
Nota: Tambien vario el valor de bitmapNombre porque representa a cada una de las imagenes del objeto, tambien en otros casos va a variar el valor de velocidad o el tag pero la estructura y el concepto sera siempre el mismo.
Anuncios

AlienLaseEspec

package org.example.invasores;

import android.graphics.PointF;

class AlienLaseEspec extends ObjetoEspec {
    private static final String tag = "alien laser";
    private static final String bitmapNombre = "alien_laser";
    private static final float velocidad = .75f;
    private static final PointF escalaRelativa =
            new PointF(14f,160f);
    private static final String[] componentes = new String[]{
            "ComponentesGraficosStd",
            "ComponenteLaserMovimiento",
            "ComponenteGeneraLaser"};

    AlienLaseEspec(){
        super(tag, bitmapNombre,
                velocidad,
                escalaRelativa,
                componentes);
    }
}
Anuncios

De vuelta volvemos a tener una estructura similar pero con sutiles diferencias, pasemos a la siguiente clase.

Anuncios

AlienPatrolEspec

package org.example.invasores;

import android.graphics.PointF;

class AlienPatrolEspec extends ObjetoEspec {
    private static final String tag = "alien";
    private static final String bitmapNombre = "alien_ship2";
    private static final float velocidad = 5f;
    private static final PointF escalaRelativa =
            new PointF(15f,15f);
    private static final String[] componentes = new String[]{
            "ComponentesGraficosStd",
            "ComponenteAlienPatrolMovimiento",
            "ComponenteGeneraAlienHorizontal"};

    AlienPatrolEspec(){
        super(tag, bitmapNombre,
                velocidad,
                escalaRelativa,
                componentes);
    }
}
Anuncios

De vuelta la misma clase pero aqui tenemos la primer particularidad, la cual es que al igual que todas las clases anterior que compartieron el componente “ComponentesGraficosStd” ahora compartimos con nuestra primera clase hija el componente “ComponenteGeneraAlienHorizontal” pero de esto hablaremos al final, pasemos a la siguiente clase.

Anuncios

FondoEspec

package org.example.invasores;

import android.graphics.PointF;

class FondoEspec extends ObjetoEspec {
    private static final String tag = "fondo";
    private static final String bitmapNombre = "background";
    private static final float velocidad = 2f;
    private static final PointF escalaRelativa =
            new PointF(1f,1f);
    private static final String[] componentes = new String[]{
            "ComponentesGraficosFondo",
            "ComponenteFondoMovimiento",
            "ComponenteGeneraFondo"};

    FondoEspec(){
        super(tag, bitmapNombre,
                velocidad,
                escalaRelativa,
                componentes);
    }
}
Anuncios

Si bien puede ser una tarea innecesaria y repetitiva tener tantas clases similares pero mas adelante veremos la practicidad de trabajar de esta manera, pasemos a la siguiente clase.

Anuncios

JugadorLaserEspec

package org.example.invasores;

import android.graphics.PointF;

class JugadorLaserEspec extends ObjetoEspec {
    private static final String tag = "jugador laser";
    private static final String bitmapNombre = "player_laser";
    private static final float velocidad = .65f;
    private static final PointF escalaRelativa =
            new PointF(8f,160f);
    private static final String[] componentes = new String[]{
            "ComponentesGraficosStd",
            "ComponenteLaserMovimiento",
            "ComponenteGeneraLaser"};

    JugadorLaserEspec(){
        super(tag, bitmapNombre,
                velocidad,
                escalaRelativa,
                componentes);
    }
}
Anuncios

Esta clase es muy similar a la del enemigo, en casi todo sentido porque comparten los mismos componentes pero despues veremos porque debemos hacerlas por separado, pasemos a la siguiente clase.

Anuncios

JugadorEspec

package org.example.invasores;

import android.graphics.PointF;

class JugadorEspec extends ObjetoEspec {
    private static final String tag = "jugador";
    private static final String bitmapNombre = "player_ship";
    private static final float velocidad = 1f;
    private static final PointF escalaRelativa =
            new PointF(15f,15f);
    private static final String[] componentes = new String[]{
            "ComponenteEntradaJugador",
            "ComponentesGraficosStd",
            "ComponenteJugadorMovimiento",
            "ComponenteGeneraJugador"};

    JugadorEspec(){
        super(tag, bitmapNombre,
                velocidad,
                escalaRelativa,
                componentes);
    }
}
Anuncios

Como pueden ver tambien mantenemos el mismo esquema pero tenemos unas sutiles diferencias con respecto a las otras clases en los componentes pero el resto sigue igual, pasemos a hablar sobre los componentes.

Anuncios
Anuncios

Los componentes seran en realidad clases que se encargan de manejar correctamente cada uno de los objetos, por ejemplo tenemos a “ComponentesGraficosStd” que se encargara de usar a una clase con el mismo nombre, ya la crearemos mas adelante, y esta implementara una interfaz (tambien la haremos mas adelante) la cual nos dara la seguridad de cada elemento es dibujado correctamente por el metodo dibujar, despues cada objeto tendra su movimiento, a excepcion de los lasers, por lo cual tambien definimos un componente para cada uno donde cada clase tendra su propia logica independiente una de la otra y por medio de otra interfaz nos garantizaremos que el metodo de actualizar lo haga correctamente para elemento, lo mismo ocurre con los componentes de generacion del elemento porque no todos tienen el mismo movimiento entonces tendremos uno para hacerlo de forma vertical, otro horizontal, otro desde la nave que corresponda (Alien o Jugador) o la del jugador que sera completamente distinta a las demas, de vuelta tendremos una clase con cada una de las logicas para hacerlo de manera correcta, por ultimo tenemos dos particularidades, la primera son los laser porque son exactamente iguales aunque varian en pequeñas cosas pero los componentes son los mismos, esto es debido a que su conducta es la misma pero la diferencia la veremos son en el apartado grafico.

Anuncios

Despues la otra estara en el jugador ya que tendra un componente que el resto no posee como es la Entrada porque este sera el unico que podremos mover libremente, como comentamos en los posts anteriores esta conducta solamente aplica a este elemento y no al resto.

Anuncios

Con esto ya tenemos la base de nuestras proximas modificaciones porque podemos tomar esto como una plantilla pero todavia nos hacen faltan los mecanismos para poder poner estas caracteristicas en accion, asi que en los proximos posts iremos agregandolo dentro de nuestro proyecto.

Anuncios

En resumen, hoy hemos visto como crear una clase base/padre/maestra o como quieran llamarla que nos sirve para crear unas hijas/herederas o como quieran, las cuales se encargaran no solo de definir los parametros de cada uno de nuestros elementos sino tambien las conductas por medio de los componentes, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00