LIBGDX TouchPad

De MediaWiki
Saltar a: navegación, buscar

UNIDADE 3: Touchpad

Introdución

Nota: Esta explicación está relacionada coa sección de Interfaces.

Clase que se utiliza: TouchPad.


O Touchpad ven ser a representación dun joystick na pantalla.

Desta forma podemos manexar o noso protagonista dunha forma máis cómoda, aínda que dependerá do tipo de xogo e pode ser que non sexa conveniente este tipo de control.

O normal é que sexa o control elixido para manexar unha nave (avión, nave espacial,...) non xogo no que se teña un movemento aberto en todas as direccións.

Proceso de visualización

Para visualizar o Touchpad imos necesitar dúas texturas que van representar o joystick, como os da seguinte imaxe:

LIBGDX UD3 Touchpad 1.jpg

Cando prememos no centro, a textura central moverase (impulsada por nos) por dentro do círculo exterior.

  • Deberedes por tanto definir dúas texturas, unha para o fondo e outra para o interior.
  • Unha vez teñades as texturas é necesario definir un estilo para o Touchpad. Para definir o estilo necesitamos facer uso dun obxecto da clase Skin que ven ser como un almacén onde definimos recursos (texturas, fontes, cores...) que van poder ser usados por elementos gráficos como botóns, caixas de texto,...

Nota: Isto o veremos posteriormente no sección de Stage UI.

  1.         private Skin touchpadSkin;
  2.         ....
  3.         @Override
  4.         public void create () {
  5.           .......
  6.                 touchpadSkin = new Skin();
  7.                 touchpadSkin.add("touchBackground", new Texture("LIBGDX_touchBackground.png"));
  8.                 touchpadSkin.add("touchKnob", new Texture("LIBGDX_touchKnob.png"));
  9.           .......
  10.         }

Nese Skin imos cargar as dúas texturas anteriores.

  • Agora necesitamos asinar o estilo ó Touchpad. Creamos por tanto un obxecto da clase TouchpadStyle.
  1.         private TouchpadStyle touchpadStyle;
  2.           .......
  3.         @Override
  4.         public void create () {
  5.           .......
  6.                 touchpadStyle = new TouchpadStyle();
  7.         }
  • A este obxecto temos que asinarlle a dúas propiedades as texturas que se atopan no Skin, pero non podemos usar obxectos da clase Texture, se non que necesitamos obxectos da clase Drawable. O obxectos da clase Drawable os podemos obter a partires do método getDrawable da clase Skin no que lle pasamos de argumento o nome utilizado na liña: touchpadSkin.add("touchBackground", new Texture("LIBGDX_touchBackground.png"));
  1.           .......
  2.         @Override
  3.         public void create () {
  4.           .......
  5.                 Drawable D_background = touchpadSkin.getDrawable("touchBackground");
  6.                 Drawable D_knob = touchpadSkin.getDrawable("touchKnob");
  7.  
  8.         }


  • Como as texturas poden ter tamaños diferentes, definimos o tamaño de cada unha chamando ó método setMinHeight e setMinWidth:
  1.           .......
  2.         @Override
  3.         public void create () {
  4.           .......
  5.                 D_background.setMinHeight(40);
  6.                 D_background.setMinWidth(40);
  7.                
  8.                 D_knob.setMinHeight(15);
  9.                 D_knob.setMinWidth(15);
  10.         }

Como vemos estamos a poñer un tamaño de 40 pixeles ó círculo exterior e de 15 pixeles ó circulo interior.

  • Unha vez temos modificados os obxectos da clase Drawable, os asinamos o estilo:
  1.           .......
  2.         @Override
  3.         public void create () {
  4.           .......
  5.                 touchpadStyle.background = D_background;
  6.                 touchpadStyle.knob = D_knob;
  7.         }
  • Agora só queda por definir o obxecto da clase Touchpad e asinarlle dito estilo:
  1.         private Touchpad touchpad;
  2.           .......
  3.         @Override
  4.         public void create () {
  5.           .......
  6.                 touchpad = new Touchpad(5, touchpadStyle);
  7.                 touchpad.setBounds(40, 40, 50, 50);
  8.         }
  • Liña 7: Instanciamos o Touchpad e pasamos como parámetros o número de pixeles con respecto ó centro, a partires do cal a bola interior do joystick se move. Como segundo parámetro leva o estilo definido.
  • Liña 8: Moi importante. O Touchpad se debe usar coa clase Stage que veremos posteriormente na sección de Scene. Coa chamada ó método setBounds(x,y,width,height) estamos a indicar a posición e tamaño do joystick.

A modo de introdución rápida diremos que a clase que necesitamos para debuxar é Stage. Dentro do Stage existen 'Actors' que son os elementos que se debuxan. Cada actor ten unha textura, posición, tamaño....

O Stage vai ter dous métodos moi importantes: act e draw.

O método act vai 'actualizar' todos os actores que se atopen engadidos ó Stage.
O método draw vai debuxar todos os actores que se atopen no Stage.

Estes métodos deben ir no método render.

  1.         private Touchpad touchpad;
  2.           .......
  3.         @Override
  4.         public void create () {
  5.           .......
  6.                 /* Stage */
  7.                
  8.                 stage = new Stage();
  9.                 stage.addActor(touchpad);
  10.                
  11.                 Gdx.input.setInputProcessor(stage);
  12.  
  13.         }

No noso caso, o Stage está conformado por un único actor que é o Touchpad. Como queremos que o Stage xestione os eventos dos actores que están engadidos a el (así moverá o roda interior do joystick) indicamos que a xestión de eventos o leve él (liña 12).

Nota: O cambiar a xestión de eventos ó Stage perdemos a xestión de interface InputProcessor. Se queredes manter as dúas teriades que utilizar múltiples interfaces de eventos como vimos anteriormente.

  • O Stage ó igual que a cámara, ten un viewport asociado. Se queremos que se modifique en función do tamaño da pantalla teremos que facer isto:
  1.         public void resize(int width, int height) {
  2.                 stage.getViewport().update(width, height, true);
  3.         }
Co parámetro true indicamos que a cámara debe situarse no centro.


  • Por último temos que facer o render dos actores:
  1.         @Override
  2.         public void render() {
  3.                 Gdx.gl.glClearColor(0, 0, 0, 1);
  4.                 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
  5.                
  6.                 stage.act(Gdx.graphics.getDeltaTime());
  7.                 stage.draw();
  8.                
  9.         }


Control do Touchpad

Para saber en que posición está o Touchpad temos os seguintes métodos:

  • getKnobPercentX(): Devolve a posición X do círculo central coma unha porcentaxe con respecto á distancia có círculo exterior. Vai dende -1 a +1 (esquerda-dereita).
  • getKnobPercentY(): Devolve a posición Y do círculo central coma unha porcentaxe con respecto á distancia có círculo exterior. Vai dende -1 a +1 (arriba-abaixo).
  • getKnobX(): Devolve a posición X do círculo central con respecto á distancia có círculo exterior. O valor vai depender do tamaño asinado ó Touchpad.
  • getKnobY(): Devolve a posición Y do círculo central con respecto á distancia có círculo exterior. O valor vai depender do tamaño asinado ó Touchpad.


Exemplo de código

Neste exemplo vaise mover un gráfico pola pantalla de acordo ó movemento do Touchpad.

Para mover o gráfico se fixo uso da clase Sprite. Dita clase permite almacenar a textura, tamaño e posición. Poderíamos utilizar unha textura e unha clase separada para gardar os datos da figura (posición, tamaño, velocidade) como fixemos no xogo seguindo o Modelo-Vista-Contralador. Non se utilizou esta clase por mezclar o modelo-vista, pero a estas alturas tedes total liberdade para utilizar esta clase.


Preparación:

  • Crear unha nova clase e cambiar os diferentes proxectos para que carguen dita clase.

Código da clase UsoTouchPad
Obxectivo: Amosar como funciona o Touchpad.

  1. import com.badlogic.gdx.ApplicationAdapter;
  2. import com.badlogic.gdx.Gdx;
  3. import com.badlogic.gdx.graphics.GL20;
  4. import com.badlogic.gdx.graphics.OrthographicCamera;
  5. import com.badlogic.gdx.graphics.Texture;
  6. import com.badlogic.gdx.graphics.g2d.Sprite;
  7. import com.badlogic.gdx.graphics.g2d.SpriteBatch;
  8. import com.badlogic.gdx.scenes.scene2d.Stage;
  9. import com.badlogic.gdx.scenes.scene2d.ui.Skin;
  10. import com.badlogic.gdx.scenes.scene2d.ui.Touchpad;
  11. import com.badlogic.gdx.scenes.scene2d.ui.Touchpad.TouchpadStyle;
  12. import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
  13.  
  14. public class UsoTouchPad extends ApplicationAdapter {
  15.         private SpriteBatch batch;
  16.  
  17.         private Skin touchpadSkin;
  18.         private TouchpadStyle touchpadStyle;
  19.         private Touchpad touchpad;
  20.        
  21.         private OrthographicCamera camara2d;
  22.        
  23.         private Stage stage;
  24.         private Sprite grafico;
  25.         private float velocidade = 5;
  26.    
  27.         @Override
  28.         public void create () {
  29.                 batch = new SpriteBatch();
  30.                
  31.                 grafico = new Sprite(new Texture("badlogic.jpg"));
  32.                 grafico.setBounds(100, 150, 25, 25);
  33.                
  34.                
  35.                 camara2d = new OrthographicCamera();
  36.                 camara2d.setToOrtho(false,300,300);
  37.                 camara2d.update();
  38.  
  39.                 batch.setProjectionMatrix(camara2d.combined);
  40.                
  41.                 /* TOUCHPAD */
  42.                 touchpadSkin = new Skin();
  43.                 touchpadSkin.add("touchBackground", new Texture("LIBGDX_touchBackground.png"));
  44.                 touchpadSkin.add("touchKnob", new Texture("LIBGDX_touchKnob.png"));
  45.                
  46.                 touchpadStyle = new TouchpadStyle();
  47.                 Drawable D_background = touchpadSkin.getDrawable("touchBackground");
  48.                 Drawable D_knob = touchpadSkin.getDrawable("touchKnob");
  49.                
  50.                 D_background.setMinHeight(40);
  51.                 D_background.setMinWidth(40);
  52.                
  53.                 D_knob.setMinHeight(15);
  54.                 D_knob.setMinWidth(15);
  55.                
  56.                 touchpadStyle.background = D_background;
  57.                 touchpadStyle.knob = D_knob;
  58.  
  59.                 touchpad = new Touchpad(5, touchpadStyle);
  60.                 touchpad.setBounds(40, 40, 50, 50);
  61.                
  62.                 /* Stage */
  63.                
  64.                 stage = new Stage();
  65.                 stage.addActor(touchpad);
  66.                
  67.                 Gdx.input.setInputProcessor(stage);
  68.         }
  69.  
  70.         @Override
  71.         public void render() {
  72.                 Gdx.gl.glClearColor(0, 0, 0, 1);
  73.                 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
  74.                
  75.                 batch.begin();
  76.                 batch.draw(grafico.getTexture(), grafico.getX(), grafico.getY(),grafico.getWidth(),grafico.getHeight());
  77.                 batch.end();
  78.                
  79.                 stage.act(Gdx.graphics.getDeltaTime());
  80.                 stage.draw();
  81.                
  82.                 //Movemos o grafico
  83.                 grafico.setX(grafico.getX() + touchpad.getKnobPercentX()*velocidade);
  84.                 grafico.setY(grafico.getY() + touchpad.getKnobPercentY()*velocidade);
  85.  
  86.         }
  87.  
  88.         public void resize(int width, int height) {
  89.                 stage.getViewport().update(width, height, true);
  90.         }
  91.  
  92.         @Override
  93.         public void dispose() {
  94.                 stage.dispose();
  95.                 batch.dispose();
  96.                 Gdx.input.setInputProcessor(null);
  97.         }
  98. }
  • Liñas 83-84: Son as encargadas de mover o Sprite en función da velocidade e da distancia do punto central ó extremo. Canto máis próximo máis velocidade.

Se executades dará como resultado isto:

LIBGDX UD3 Touchpad 2.jpg


TAREFA OPTATIVA A FACER



Modificade o control do xogo para mover o Alien utilizando un TouchPad.







-- Ángel D. Fernández González -- (2015).