Catapum Parte 2: Accelerometer

En nuestro primer juego intentamos tocar un poco en todos los campos para poder llegar a hacer un juego, es un ejemplo bastante sencillo de implementar y podemos ver como cocos2d nos va a agilizar enormemente todo el proceso. Pero ahora vamos a ver como sobre el mismo juego podemos incluir cosas nuevas, y vamos a empezar por cambiar el control del joystick por los acelerometros.

No nos vamos a poder librar del joystick completamente ya que va a seguir siendo necesario para los botones pero quitaremos el stick y pasaremos a mover nuestra nave inclinando nuestro dispositivo. Como ya sabemos nuestro iPhone tiene 3 acelerometros que nos van a dar en todo momento la inclinacion en cada uno de los ejes. Lo primero que tenemos que tener presente a la hora de trabaja con un acelerometros es saber sobre que plano vamos a calcular la inclinación, en nuestro caso queremos el angulo XY por lo que deberemos calcular la arcotangente de estos 2 valores para saber el angulo de inclinación

No os asusteis mucho por como suenta, porque sobre codigo esto solo es una instrucción:

Esto nos dará como resultado un angulo que nos indicará en que dirección está apuntando nuestro dispositivo, en esta imagen podeis ver ese angulo representado de forma grafica:

Es decir .. si mantenemos nuestro dispositivo en horizontal este nos dará 180 grados, si giramos hacia la derecha nos dará -90 grados y si giramos a la izquierda nos dará 90 grados. Realmente es una faena que nos encontremos justo en el angulo donde cambiamos de signo y probablemente se hubiera solucionado haciendo el atan2(-y,x) .. pero tampoco es mi intención esquivar los problemas, y si nos va a dar los ángulos así no es ningún problema.

Modificar el Joystick

Empezaremos por quitar el Stick y configurar los 2 botones, también vamos a quitar completamente los sprites del joystick, nisiquiera dejaremos los botones, lo que haremos será dividir la pantalla en 2 areas, toda la mitad izquierda de la pantalla será el botón A y toda la mitad derecha será el botón B

Capturar el angulo de inclinación

Empezamos por ir a nuestro método ‘init’ y decirle al cocos2d que queremos controlar los eventos del acelerometro.

A partir de este momento empezaremos a recibir eventos en nuestro metodo accelerometer.
Very important: Este método SOLO se llama cuando se produce algún cambio en la inclinación del dispositivo, lo que significa que NO es un buen lugar donde tomar decisiones, limitaros únicamente a guardar el angulo de inclinación del dispositivo. Y que sea otro método, que se ejecute de forma constante, el que transforme ese angulo en movimiento

Definimos de forma global la variable angleX

A continuación vamos a seguir usando nuestro metodo ‘updateJoystick’ para mover la nave y también para seguir leyendo los clicks sobre los botones A y B.

En este método podéis ver como se usa el valor de angleX para incrementarselo al vector velocity, esto significa que mientras tengamos el dispositivo inclinado estaremos moviéndonos en una dirección. Del mismo modo recordar que este metodo se llama mediante un scheduler de cocos2d … asi que no podemos saber cada cuanto tiempo nos llama y por tanto debemos multiplicar el valor del angleX por el delta.

Autorotate

No hemos hecho muchos cambios para usar los acelorometros, pero debemos tener en cuenta que por defecto cocos2d crea un proyecto con el rotate de la pnatalla activado, es decir que si damos la vuelta a nuestro dispositivo no rota la pantalla para tener siempre el juego en la horientación correcta. Para este juego estamos calculando el angulo de inclunación, y os recuerdo que habiamos ignorado la parte 90-90 de la rotación. Asi que debemos anular el autorotate del dispositivo:

Para ello vamos al archivo GameConfig.h y cambiamos este define para poner el valor kGameAutorotationNone

Desde os podeis descargar el proyecto completo
 Catapum v2-accelerometer.zip (1.9 Mb)

FIN!!!!!!

You may also like...

2 Responses

  1. alejandro dice:

    Hice todo bien lo pruebo funciona pero no me deja ir para arriba se queda abajo del todo Como se soluciona?

  2. neofar dice:

    Es que en este ejemplo no se mueve arriba ni abajo, solo se usa el acelerometro para movernos a los lados … de hecho esta parte del código te debería haber dado alguna pista:

    velocity.x += angleX * delta;
    // no hay desplazamiento en Y

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *