Lección 4: Controlando el movimiento

Requerimientos: Haber leído Lección 3.

 

En este lección veremos cómo mover un cuadrado por la pantalla, utilizando los botones direccionales de la consola.

Al igual que en el ejemplo de la lección 3, debemos ir actualizando la posición de nuestro cuadrado, que en este caso llamaremos jugador. Es por eso que debemos declarar también variables que representen la posición:

int jugadorX = 0;
int jugadorY = 0; 

A diferencia del ejemplo de la lección 3, en este caso, la actualización y visualización en pantalla, sólo debemos hacerla cuando se detecte que se ha presionado un botón direccional (arriba, abajo, izquierda o derecha).

Para esta detección usaremos la función pressedButton(), la cual nos dice si en un momento dado, se está presionando un botón. El botón a detectar está determinado por el parámetro enviado a la función. Los posibles parámetros son:

BTN_UP, BTN_RIGHT, BTN_DOWN, BTN_LEFT, BTN_A, BTN_B, BTN_C, los cuales son los identificadores de los botones Arriba,Derecha,Abajo,Izquierda,A,B,C respectivamente.

Para este ejemplo utilizaremos los primeros 4 identificadores, correspondientes a los botones direccionales.

Por ejemplo si quisiera hacer algo cuando se detecte presionado el botón direccional Arriba, escribiríamos:

if (geo.pressedButton(BTN_UP)) {
   //hacemos algo
 }
 

Es decir, el código entre llaves se ejecutaría cuando la invocación geo.pressedButton(BTN_UP) retorna verdadero, o sea, cuando el botón Arriba está siendo presionado.

Entonces, si actualizamos la posición del jugador según el botón direccional presionado, el código nos quedaría:

void loop() {
  geo.waitFrame();
  geo.clearDisplay();
  
  if (geo.pressedButton(BTN_LEFT)) {
    jugadorX = jugadorX - 1;
  }
  if (geo.pressedButton(BTN_RIGHT)) {
    jugadorX = jugadorX + 1;
  }
  if (geo.pressedButton(BTN_UP)) {
    jugadorY = jugadorY - 1;
  }
  if (geo.pressedButton(BTN_DOWN) ) {
    jugadorY = jugadorY + 1;
  }
 
  geo.drawRect(jugadorX, jugadorY, 10,10);
}
 

En la última línea se realiza el dibujo de un cuadrado sin relleno de 10 pixeles por lado, en la posición actual.

Si ejecutamos el código, veremos que podemos mover nuestro jugador usando los botones direccionales de la consola.

Sin embargo, el personaje puede moverse más allá de los límites de la pantalla. Para evitar esto, restringimos la condiciones en las cuales se debe  actualizar la posición del jugador, de acuerdo a su posición actual. 

El código final quedaría:

#include <Geobuino.h>
Geobuino geo;
 
int jugadorX = 0;
int jugadorY = 0;
 
void setup() {
 geo.begin();
}
 
void loop() {
 geo.waitFrame();
 geo.clearDisplay();
  
 if (geo.pressedButton(BTN_LEFT) && jugadorX>0) {
    jugadorX = jugadorX - 1;
 }
 if (geo.pressedButton(BTN_RIGHT)  && jugadorX< (DISPLAY_WIDTH-10)) {
   jugadorX = jugadorX + 1;
 }
 if (geo.pressedButton(BTN_UP) && jugadorY>0) {
   jugadorY = jugadorY - 1;
 }
 if (geo.pressedButton(BTN_DOWN) && jugadorY< (DISPLAY_HEIGHT-10)) {
   jugadorY = jugadorY + 1;
 }
 
 geo.drawRect(jugadorX, jugadorY, 10,10);
}