Anuncios

Bienvenidos sean a este post, en este post nos centraremos en el verdadero corazon a la hora de crear los niveles y completar, en parte, a la clase del post anterior.

Anuncios

Para comenzar con este tema vamos a crear una nueva clase con estas caracteristicas:

  • Nombre: ManagerNivel
  • Tipo: Class
Anuncios

Modifiquemos el codigo con el siguiente:

package org.example.pepeaventura;

import android.content.Context;

import org.example.pepeaventura.niveles.Nivel;
import org.example.pepeaventura.niveles.NivelCiudad;
import org.example.pepeaventura.niveles.NivelCueva;
import org.example.pepeaventura.niveles.NivelMontana;

import java.util.ArrayList;

final class ManagerNivel {
    static int JUGADOR_INDICE = 0;
    private ArrayList<GameObjeto> objetos;
    private Nivel nivelActual;
    private GameObjetoFabrica fabrica;

    ManagerNivel(Context contexto,
                 GameEngine ge,
                 int pixelsPorMetro){
        objetos = new ArrayList<>();
        fabrica = new GameObjetoFabrica(
                contexto,
                ge,
                pixelsPorMetro);
    }

    void setNivelActual(String nivel){
        switch (nivel){
            case "cueva":
                nivelActual = new NivelCueva();
                break;
            case "ciudad":
                nivelActual = new NivelCiudad();
                break;
            case "montana":
                nivelActual = new NivelMontana();
                break;
        }
    }
}
Anuncios
Anuncios

En este caso establecimos el valor de nuestro jugador (JUGADOR_INDICE), despues tenemos un ArrayList con los objetos, seguido del nivel que trabajaremos y por ultimo nuestra “fabrica” de objetos, con esto ya tenemos nuestras variables, lo siguiente es el constructor donde recibiremos tres datos, uno de ellos de tipo GameEngine pero que todavia no creamos, los otros son para ajustar la velocidad (fps) y para escalar nuestra imagen en la camara, dentro del constructor definiremos o creamos el espacio en memoria para la fabrica y objetos, por ultimo tendremos un metodo encargado de crear al nivel que jugaremos para ello recibe como dato el nivel y despues por medio de un switch chequearemos cual valor es y de acuerdo a este crearemos un objeto en base a este:

  • Si nivel es cueva crea un objeto de tipo NivelCueva
  • En cambio si ciudad crea uno de tipo NivelCiudad
  • Y si es montana llamara a NivelMontana
Anuncios

Nuestro siguiente paso sera agregar este metodo:

    void construirObjetosJuego(GameState gs){
        /*
            Esto nos servira como referencia para saber a que
            equivale de las claves de las losas en las clases de
            los niveles.
            fondos = 1,2,3 (ciudad, cueva y montaña respectivamente)
            p = jugador
            g = cesped
            o = objetivo
            m = plataforma movible
            b = losas
            c = carrito
            s = pila de piedra
            l = carbon
            n = concreto
            a = poste de luz
            r = piso quemado
            w = piso nevado
            t = estalactita
            i = estalagmita
            d = arbol muerto
            e = arbol nevado
            x = collecionable (moneda)
            y = muerte invisible (visible)
         */

        gs.reseteoMonedas();
        objetos.clear();
        ArrayList<String> nivelAcargar = nivelActual.getLosas();

        for(int fila=0; fila < nivelAcargar.size(); fila++){
            for(int columna = 0;
                columna < nivelAcargar.get(fila).length(); columna++){

                PointF coords = new PointF(columna,fila);

                switch (nivelAcargar.get(fila).charAt(columna)){
                    case '1':
                        break;
                    case '2':
                        break;
                    case '3':
                        break;
                    case 'p':
                        break;
                    case 'g':
                        objetos.add(fabrica.crear(new EspecCesped(),coords));
                        break;
                    case 'o':
                        objetos.add(fabrica.crear(new EspecObjetivo(),coords));
                        break;
                    case 'm':
                        break;
                    case 'b':
                        objetos.add(fabrica.crear(new EspecLosas(),coords));
                        break;
                    case 'c':
                        objetos.add(fabrica.crear(new EspecCarrito(),coords));
                        break;
                    case 's':
                        objetos.add(fabrica.crear(new EspecPilaPiedras(),coords));
                        break;
                    case 'l':
                        objetos.add(fabrica.crear(new EspecCarbon(),coords));
                        break;
                    case 'n':
                        objetos.add(fabrica.crear(new EspecConcreto(),coords));
                        break;
                    case 'a':
                        objetos.add(fabrica.crear(new EspecPosteLuz(),coords));
                        break;
                    case 'r':
                        objetos.add(fabrica.crear(new EspecPisoQuemado(),coords));
                        break;
                    case 'w':
                        objetos.add(fabrica.crear(new EspecPisoNevado(),coords));
                        break;
                    case 't':
                        objetos.add(fabrica.crear(new EspecEstalactita(),coords));
                        break;
                    case 'i':
                        objetos.add(fabrica.crear(new EspecEstalagmita(),coords));
                        break;
                    case 'd':
                        objetos.add(fabrica.crear(new EspecArbolMuerto(),coords));
                        break;
                    case 'e':
                        objetos.add(fabrica.crear(new EspecArbolNevado(),coords));
                        break;
                    case 'x':
                        objetos.add(fabrica.crear(new EspecColeccionable(),coords));
                        break;
                    case 'z':
                        break;
                    case 'y':
                        objetos.add(fabrica.crear(
                                new EspecMuerteInvisible(),coords));
                        break;
                    case '.':
                        break;
                    default:
                        Log.e("Item no asignable aquil",
                                "fila:" + fila+ " columna:" + columna);
                        break;
                }
            }
        }
    }
Anuncios

Este metodo parece largo y complejo pero en realidad no porque el primer bloque es simplemente un comentario para saber que representa cada letra en la clase del nivel que agregamos, esta referencia nos servira un poco mas adelante, como este metodo recibe un GameState lo primero que hacemos es resetear el contador de monedas y limpiamos los objetos en objetos, 🦆, y por ultimo creamos un ArrayList para usarlo como el nivel a cargar, despues tendremos un bloque complejo pero no tanto.

Anuncios
Anuncios

En este caso tenemos un bucle for primero para generar la fila, donde el limite lo estableceremos con el metodo size del nivel cargado, luego tendremos un bucle for que generemos la columna, pero en este caso el limite lo obtenemos por medio de length, esto trabajara de la siguiente forma, en el segundo for pasaremos por todas las columnas del nivel y una vez hecho esto pasaremos a la siguiente fila de la cual se encargara el primer for, volvamos a hablar sobre el segundo for, en este caso crearemos una variable de tipo PointF la cual se llamara coords y en esta almacenaremos los valores de la columna y fila que generamos con los bucles, lo siguiente sera obtener el caracter en cada una de las filas y columnas donde por medio de un switch iremos verificando que valores tienen, en este caso en particular usaremos las letras que mencionamos en el bloque de comentarios, si observan hay varios que estan vacios para estos casos particulares es porque todavia no tenemos unas clases para manejarlas, la unica excepcion es el caracter punto (.) porque representa al espacio en blanco o que no muestre ningun caracter, el resto trabajan de una forma similar pero solamente llamaran a la clase que les corresponda, vamos a tomar uno de ejemplo:

case 'b':
    objetos.add(fabrica.crear(new EspecLosas(),coords));
    break;
Anuncios

En este caso siempre que encuente al caracter b por cada pasada de los bucles tomaremos a objetos y por medio de add le agregamos un nuevo elemento, para ello usamos a fabrica y el metodo crear donde por medio de la clase EspecLosas crearemos el nuevo elemento y coords es la encargada de decirle el lugar debe crearla, esto lo haremos en todos los case pero en cada caso llamara a la clase que le corresponde, por ultimo vamos a agregar el siguiente metodo:

    ArrayList<GameObjeto> getGameObjetos(){
        return objetos;
    }
Anuncios

Este metodo lo unico que hace es devolver a objetos para poder procesar en pantalla todas las modificaciones que realizamos anteriormente, con esto ya tenemos concluida nuestra clase veamos como es su codigo final:

ManagerNivel.java

package org.example.pepeaventura;

import android.content.Context;
import android.graphics.PointF;
import android.util.Log;

import org.example.pepeaventura.especoj.EspecArbolMuerto;
import org.example.pepeaventura.especoj.EspecArbolNevado;
import org.example.pepeaventura.especoj.EspecCarbon;
import org.example.pepeaventura.especoj.EspecCarrito;
import org.example.pepeaventura.especoj.EspecCesped;
import org.example.pepeaventura.especoj.EspecColeccionable;
import org.example.pepeaventura.especoj.EspecConcreto;
import org.example.pepeaventura.especoj.EspecEstalactita;
import org.example.pepeaventura.especoj.EspecEstalagmita;
import org.example.pepeaventura.especoj.EspecLosas;
import org.example.pepeaventura.especoj.EspecMuerteInvisible;
import org.example.pepeaventura.especoj.EspecObjetivo;
import org.example.pepeaventura.especoj.EspecPilaPiedras;
import org.example.pepeaventura.especoj.EspecPisoNevado;
import org.example.pepeaventura.especoj.EspecPisoQuemado;
import org.example.pepeaventura.especoj.EspecPosteLuz;
import org.example.pepeaventura.niveles.Nivel;
import org.example.pepeaventura.niveles.NivelCiudad;
import org.example.pepeaventura.niveles.NivelCueva;
import org.example.pepeaventura.niveles.NivelMontana;

import java.util.ArrayList;

final class ManagerNivel {
    static int JUGADOR_INDICE = 0;
    private ArrayList<GameObjeto> objetos;
    private Nivel nivelActual;
    private GameObjetoFabrica fabrica;

    ManagerNivel(Context contexto,
                 GameEngine ge,
                 int pixelsPorMetro){
        objetos = new ArrayList<>();
        fabrica = new GameObjetoFabrica(
                contexto,
                ge,
                pixelsPorMetro);
    }

    void setNivelActual(String nivel){
        switch (nivel){
            case "cueva":
                nivelActual = new NivelCueva();
                break;
            case "ciudad":
                nivelActual = new NivelCiudad();
                break;
            case "montana":
                nivelActual = new NivelMontana();
                break;
        }
    }

    void construirObjetosJuego(GameState gs){
        /*
            Esto nos servira como referencia para saber a que
            equivale de las claves de las losas en las clases de
            los niveles.
            fondos = 1,2,3 (ciudad, cueva y montaña respectivamente)
            p = jugador
            g = cesped
            o = objetivo
            m = plataforma movible
            b = losas
            c = carrito
            s = pila de piedra
            l = carbon
            n = concreto
            a = poste de luz
            r = piso quemado
            w = piso nevado
            t = estalactita
            i = estalagmita
            d = arbol muerto
            e = arbol nevado
            x = collecionable (moneda)
            y = muerte invisible (visible)
         */

        gs.reseteoMonedas();
        objetos.clear();
        ArrayList<String> nivelAcargar = nivelActual.getLosas();

        for(int fila=0; fila < nivelAcargar.size(); fila++){
            for(int columna = 0;
                columna < nivelAcargar.get(fila).length(); columna++){

                PointF coords = new PointF(columna,fila);

                switch (nivelAcargar.get(fila).charAt(columna)){
                    case '1':
                        break;
                    case '2':
                        break;
                    case '3':
                        break;
                    case 'p':
                        break;
                    case 'g':
                        objetos.add(fabrica.crear(new EspecCesped(),coords));
                        break;
                    case 'o':
                        objetos.add(fabrica.crear(new EspecObjetivo(),coords));
                        break;
                    case 'm':
                        break;
                    case 'b':
                        objetos.add(fabrica.crear(new EspecLosas(),coords));
                        break;
                    case 'c':
                        objetos.add(fabrica.crear(new EspecCarrito(),coords));
                        break;
                    case 's':
                        objetos.add(fabrica.crear(new EspecPilaPiedras(),coords));
                        break;
                    case 'l':
                        objetos.add(fabrica.crear(new EspecCarbon(),coords));
                        break;
                    case 'n':
                        objetos.add(fabrica.crear(new EspecConcreto(),coords));
                        break;
                    case 'a':
                        objetos.add(fabrica.crear(new EspecPosteLuz(),coords));
                        break;
                    case 'r':
                        objetos.add(fabrica.crear(new EspecPisoQuemado(),coords));
                        break;
                    case 'w':
                        objetos.add(fabrica.crear(new EspecPisoNevado(),coords));
                        break;
                    case 't':
                        objetos.add(fabrica.crear(new EspecEstalactita(),coords));
                        break;
                    case 'i':
                        objetos.add(fabrica.crear(new EspecEstalagmita(),coords));
                        break;
                    case 'd':
                        objetos.add(fabrica.crear(new EspecArbolMuerto(),coords));
                        break;
                    case 'e':
                        objetos.add(fabrica.crear(new EspecArbolNevado(),coords));
                        break;
                    case 'x':
                        objetos.add(fabrica.crear(new EspecColeccionable(),coords));
                        break;
                    case 'z':
                        break;
                    case 'y':
                        objetos.add(fabrica.crear(
                                new EspecMuerteInvisible(),coords));
                        break;
                    case ".":
                        break;
                    default:
                        Log.e("Item no asignable aquil",
                                "fila:" + fila+ " columna:" + columna);
                        break;
                }
            }
        }
    }

    ArrayList<GameObjeto> getGameObjetos(){
        return objetos;
    }
}
Anuncios

En resumen, hoy hemos creado la clase que se encargara de generar los elementos de nuestros niveles, en base a los caracteres que le pasamos por medio de las clases de los niveles, hemos visto como lo establece, como por medio de dos bucles for obtenemos las filas y columnas de nuestra clase y luego por medio de fabrica iremos agregandola a objetos para finalmente tener un metodo que devolvera esta creacion, espero les haya gustado y pronto podamos probarlo, 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.

Donación

Es para mantenimento del sitio, gracias!

$1.00