Anuncios

Bienvenidos sean a este post, en este post crearemos la clase encargada de controlar nuestra interfaz por medio de la observacion tal como hicimos en el proyecto anterior.

Anuncios

Comencemos agregando una nueva clase con las siguientes caracteristicas:

  • Nombre: UIcontroladora
  • Tipo: Class
Anuncios

Una vez creada la nueva clase modificaremos el codigo con el siguiente:

package org.example.pepeaventura;

import android.graphics.Point;

class UIcontroladora implements ObservadorEntrada {
    private float mTercero;

    private boolean mPresionInicial = false;

    UIcontroladora(GameEngineBroadcaster b, Point tamano){
        addObservador(b);
        mTercero = tamano.x / 3;
    }

    void addObservador(GameEngineBroadcaster b){
        b.addObservador(this);
    }
}
Anuncios
Anuncios

En este caso implementaremos a la interfaz ObservadorEntrada, para poder monitorear a todas nuestras entradas o toques en pantalla, tendremos dos variables, la primera es para saber el valor de un tercio de la pantalla y la segunda se usa para evitar un error o bug que nos puede suceder, despues tenemos el constructor donde recibiremos dos datos, el primero lo usaremos para agregarlo como observador y el segundo lo usaremos para definir a mTercero con lo dicho anteriormente, por ultimo tenenos el metodo addObservador que usamos en el constructor que lo unico que hace es enviar el this al GameEngineBroadcaster que informemos en el constructor, vamos a agregar nuestro ultimo metodo para esta clase:

    @Override
    public void handleInput(MotionEvent evento,
                            GameState gs,
                            ArrayList<Rect> botones){
        int i = evento.getActionIndex();
        int x = (int) evento.getX(i);

        int tipoEvento = evento.getAction()
                & MotionEvent.ACTION_MASK;

        if (tipoEvento == MotionEvent.ACTION_UP
                || tipoEvento == MotionEvent.ACTION_POINTER_UP){

            if (gs.getGameOver() && mPresionInicial){

                if (x < mTercero){
                    gs.setNivelActual("cueva");
                    gs.iniciaNuevoJuego();
                } else if(x >= mTercero && x < mTercero * 2){
                    gs.setNivelActual("montana");
                    gs.iniciaNuevoJuego();
                } else if (x >= mTercero * 2){
                    gs.setNivelActual("ciudad");
                    gs.iniciaNuevoJuego();
                }
            }

            mPresionInicial = !mPresionInicial;
        }
    }
Anuncios

Con este metodo implementaremos la interfaz ObservadorEntrada, recibira tres datos:

  • evento, recibira el evento de toque de pantalla
  • gs, es la instancia para manejar al GameState
  • botones, es el array de objetos para los botones
Anuncios

Despues tendremos dos variables de tipo int, en la primera almancenamos el indice del toque registrado en evento, la siguiente sera para obtener el eje X donde se realizo dicho evento, la siguiente variable sera para traducir la accion obtenida con evento, esto gracias a ACTION_MASK, con este dato obtenido usaremos un condicional para verificar las posibles acciones de cuando levantamos el dedo de la pantalla, ACTION_UP y ACTION_POINTER_UP, despues habra otro condicional donde verifica si GameState esta en GameOver y mPresionInicial no es false,

Anuncios
Anuncios

Despues tendremos otro condicional donde verifica si el valor de x es menor a mTercero, un tercio de la pantalla, en caso de ser cierto quiere decir que toco la primer parte de la pantalla por ende quiere jugar al nivel de la cueva, setea al nivel como el actual y lo inicia, luego tenemos un condicional donde verifica si es mayor o igual a mTercero pero menor a mTercero multiplicado por dos, esto equivale a decir que esta en la mitad de la pantalla por ende entendemos que deseamos jugar al nivel de la montaña, con esto volvamos a hacer lo mismo que antes pero esta vez seteamos el nivel actual como montana e iniciamos un nuevo juego, el ultimo condicional verifica si x es mayor a mTercero multiplicado por dos, es decir que equivale el ultimo tercio de la pantalla por lo que seteara el nivel como ciudad y lo inicia, por ultimo salimos de este grupo de condicionales y al valor de mPresionInicial lo negaremos, es decir que por cada toque le cambiaremos su estado de false a true y viceversa, con esto nos aseguramos que una vez seleccionado el nivel podamos ingresar, veamos su codigo final:

UIcontroladora.java

package org.example.pepeaventura;

import android.graphics.Point;
import android.graphics.Rect;
import android.view.MotionEvent;

import java.util.ArrayList;

class UIcontroladora implements ObservadorEntrada {
    private float mTercero;

    private boolean mPresionInicial = false;

    UIcontroladora(GameEngineBroadcaster b, Point tamano){
        addObservador(b);
        mTercero = tamano.x / 3;
    }

    void addObservador(GameEngineBroadcaster b){
        b.addObservador(this);
    }

    @Override
    public void handleInput(MotionEvent evento,
                            GameState gs,
                            ArrayList<Rect> botones){
        int i = evento.getActionIndex();
        int x = (int) evento.getX(i);

        int tipoEvento = evento.getAction()
                & MotionEvent.ACTION_MASK;

        if (tipoEvento == MotionEvent.ACTION_UP
                || tipoEvento == MotionEvent.ACTION_POINTER_UP){

            if (gs.getGameOver() && mPresionInicial){

                if (x < mTercero){
                    gs.setNivelActual("cueva");
                    gs.iniciaNuevoJuego();
                } else if(x >= mTercero && x < mTercero * 2){
                    gs.setNivelActual("montana");
                    gs.iniciaNuevoJuego();
                } else if (x >= mTercero * 2){
                    gs.setNivelActual("ciudad");
                    gs.iniciaNuevoJuego();
                }
            }

            mPresionInicial = !mPresionInicial;
        }
    }
}
Anuncios

En resumen, hoy fue un post corto donde creamos la clase que sera encargada de monitorear todos los toques en pantalla y enviarlos a los observadores que corresponda, 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.

Donación

Es para mantenimento del sitio, gracias!

$1.00