viernes, 15 de noviembre de 2013

Procesador de entradas y de gestos.



Saludos de nuevo! ya hemos aprendido a interaccionar con actores, clicarlos, moverlos, lanzarlos etc pero siempre dentro de un actor, voy a explicar en una pequeña entrada como implementar en nuestro juego un procesador de entradas y un procesador de gestos.






InputProcessor

El "InputProcessor" es una interfaz que tiene varios métodos, de los cuales en la entrada anterior hemos hablado ya en los actores, la interfaz la podemos implementar en cualquier clase, en una Screen, en la logica, y una vez implementada la tenemos que "seleccionar" en el procesador de entradas de libgdx con el método Gdx.input.setInputProcessor(Classe con la interfaz);
Escribo una classe cualquiera creada de nuevo donde implemento la interfaz.

package com.Firedark.libgdxspain;

import com.badlogic.gdx.InputProcessor;

public class MyInputProcessor implements InputProcessor{

    @Override
    public boolean keyDown(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
        // TODO Auto-generated method stub
        return false;
    }

}

Una vez creada la clase, se instancia en la clase principal o en la que queraís y la seleccionais con el método Gdx.input.setInputProcessor(claseimplementada); Una vez lo hagaís y toqueís por el ejemplo la pantalla, se llamará al método touchDown de ésta clase, así pasará cuando movaís el raton (solo en desktop) cuando toqueis una tecla del teclado keyDown(), keyUp() etc.

Ésta interfaz la podemos instanciar en cualquier parte, junto a la interfaz Screen, directamente en la clase principal, en un actor de lógica, sólo teneís que acordaros de usar el método Gdx.input.setInputProcessor(claseimplementada);

GestureListener

package com.Firedark.libgdxspain;

import com.badlogic.gdx.input.GestureDetector.GestureListener;
import com.badlogic.gdx.math.Vector2;

public class MyGestureDetector implements GestureListener {

    @Override
    public boolean touchDown(float x, float y, int pointer, int button) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean tap(float x, float y, int count, int button) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean longPress(float x, float y) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean zoom(float initialDistance, float distance) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2,
            Vector2 pointer1, Vector2 pointer2) {
        // TODO Auto-generated method stub
        return false;
    }

}

Funciona exactamente igual que el InputProcessor, pero ésta interfaz nos detecta los gestos que hagas en la pantalla. Aqui va mi clase con la interfaz. 

Debeís seleccionarla con el método Gdx.input.setInputProcessor(clase), pero no lo podeís hacer directamente, ya que el GestureListener en si no es un InputProcessor, para ello debeís crear una clase GestureDetector y pasarle nuestro GestureListener, se haría así:

Gdx.input.setInputProcessor(new GestureDetector(miobjetogesturelistener));

También la podeís implementar en cualquier clase.

InputMultiplexer

Ahora se nos plantea un problema, si yo selecciono que mi procesador de entradas sea el del Stage de mi scenes2d no puedo tener mi procesador de entradas a la vez, y tampoco podré gestionar gestos y entradas juntas, pero para ello tenemos la clase InputMultiplexer, que nos permitirá tener seleccionados varios procesadores de entradas. Es muy sencilla de usar, escribo un claro ejemplo de su uso y os dejo que investigueís un poco:

        InputMultiplexer multi = new InputMultiplexer();
        multi.addProcessor(game.myinputprocessor);
        multi.addProcessor(new GestureDetector(game.mygesturelistener));
        multi.addProcessor(stage);
        Gdx.input.setInputProcessor(multi);


Con ésto funcionarán los actores, las teclas y los gestos que queramos.

Ésto a sido todo ésta semana y para la semana que viene seguimos. Gracias a tod@s y hasta otra.

2 comentarios:

  1. Muy claros y directos los tutoriales, muy buen blog. La única "critica constructiva" que podría hacer es un detalle, y es el tema del código. Tal vez con algún plugin del blog puedas hacer que el código se coloreé automáticamente y sea más legible y cómodo a la vista... pero como digo, es sólo un detalle. Sigue así.

    ResponderEliminar
  2. Buenas, amigo... muy bueno tu blog... lo empeze a ver saltado y me parece interesante implementarlo cada paso y cada post subido, por que es un tutorial en si, y eso me encanto, solo una duda:

    en la clase Actor el metodo "draw (SpriteBatch...m,....)" no existe en la actual version del libgdx, espero me puedas ayudar o actualizar si esposible eso en el blog, gracias.
    sigue adelante, espero puedas implementar mucho y seguir ayudando a novatos como yo y otros de mejores habilidades.

    ResponderEliminar