Programación de Juegos para Android

Programación de Juegos para Android 27: Saltos

42 videos

238 minutos

Vamos a agregar el soporte para saltos. Para ello Box2D nos ofrece la posibilidad de crear dos tipos de fuerzas en nuestros cuerpos. Unos son fuerzas reales y otros son impulsos. Por ejemplo, voy a crear un método llamado saltar, que va a ser el que luego voy a usar en determinados momentos, por ejemplo al tocar la pantalla o al producirse una colisión para detectar si hay que continuar saltando porque la pantalla siga pulsada,

que se va a ocupar de llamar a un método de minijoeBody: apply… hay muchas cosas. Os comentaba que hay una diferencia entre fuerza e impulso. La fuerza es una variación de la velocidad que se hace de forma progresiva con el tiempo, por ejemplo para cambiar la velocidad conforme pasa el tiempo. Mientras que los impulsos cambian la velocidad de golpe. En según que casos nos va a interesar más force que impulse, pero en este caso para hacer el salto

me interesa que la velocidad cambie de golpe para que el jugador salte y no se coma lo que tiene delante, así que voy a usar Impulse. Aquí es importante distinguir todos los métodos que hay. A veces tenemos que pasar un vector, y a veces tenemos que pasar componentes flotantes. Esto es para que si tenemos un vector ya preparado lo pasemos y ya, pero si no lo tenemos pasemos las componentes, y es que Box2D lo que quiere con esto es

evitar que tengamos que instanciar vectores en algunos métodos que no es apropiado, por ejemplo en el render o en el update, donde instanciar algo 60 veces por segundo hará que el recolector de basura de Java básicamente tire humo. Así que simplemente con pasar los componentes como un flotante será suficiente. Vemos que siempre se repite un patrón: siempre hay un parámetro llamado force, impulse, forceX, forceY y siempre uno llamado Point.

De ese modo además de decirle la magnitud de la fuerza del impulso que queremos aplicar, le podemos decir dónde lo queremos aplicar, de modo que le podemos pedir a Box2D que lo aplique sobre un borde del objeto o sobre el centro, para lo que tenemos también algunos métodos especiales como toCenter, para aplicarlo al centro. Además tenemos un parámetro llamado wake, con el que le podemos pedir que despierte o reactive un objeto que previamente haya en modo de reposo,

modo de ahorro de energía suena un poco mal. Para que no consuma ciclos de CPU, ya os lo dije. Si está dormido, por decirlo de algún modo, lo “despierta” para poder aplicar esa fuerza, ya que si no puede que no se aplique bien. En mi caso voy a aplicar un impulso lineal, y como no tengo ningún vector lo voy a hacer con parámetros flotantes. Lo voy a hacer horizontalmente con valor de 0 para no moverlo horizontalmente, pero verticalmente quiero una fuerza de 20 N,

para que lo mueva hacia arriba. En cuanto a posición, centro. Pero cómo sólo lo conozco a partir del centro se lo voy a preguntar. Para ello Body tiene un parámetro, getPosition(), que nos da la posición. Y yo lo guardo en un Vector2. Es importante distinguir que este Vector2 no está instanciado, este ya está instanciado así que es seguro. Todo lo que se guardará aquí es la referencia. Lo que no debemos hacer es, básicamente, new. new es lo malo, lo que hace que cada vez que

termine el método el recolector de basura tenga más y más cosas que hacer. Le paso las componentes x,y como parámetros en Point, y finalmente le digo que lo despierte. Y con esto ya tengo definido el método saltar. Estará más bonito luego pero esto funciona, y para probarlo, haremos que cada vez que el jugador toque la pantalla con el dedo, salte. Por ejemplo, Gdx.input.justTouched(), si es verdadero, hacemos que salte. Esto está quedando feo porque está aquí.

Lo suyo sería tenerlo en distintos objetos. Por ejemplo, EntityBody, EntitySuelo; pero se trata de tener aquí todas las variables, ya haremos limpieza más adelante. Ahora, cuando pulsamos, el jugador saltará. Y funciona así. Si lo ejecuto, como veis, el cuerpo cae, pero si toco la pantalla, el cuerpo salta. Y salta, de hecho, a un ritmo que debo calibrar aún, cuando el jugador se mueva para que nos aseguremos de que no nos comemos lo que tengamos delante al hacer el salto pero es un avance.

Aunque es cierto que se comporta algo errático, porque puedo hacer ahora mismo que salte todo el tiempo, y debo evitar que esto pueda ocurrir. Para evitarlo una mejor forma es asegurarme que puedo detectar cuando haya chocado con el suelo para hacer que sólo en ese momento se compruebe si debe saltar o no y así que el jugador no tenga libertad para saltar constantemente. Veamos cómo podemos implementar colisiones.

Si quieres enterarte de los nuevos cursos, suscríbete. No habrá spam, prometido :)

Sobre el autor

foto de jotajotavm
José Javier Villena

jotajota pa los amigos y jota pa los de más cnfianza.

Bio Seria: Analista-Programador en diferentes lenguajes. Tutor PREMIUM de reconocidas plataformas de nivel mundial como CodigoFacilito. Redactor de artículos para Cristalab. Mi canal de YouTube está patrocinado por la editorial ANAYA y LaTostadora. Me gusta explicar con detalle y poner varios ejemplos para que no queden dudas.

Bio Molona: Me presento :) soy informatico, ni frostis d hardware pero muy muxo de programacion, friki a medias o del to segun el dia. Me gusta programar, muxo. Manejo varios lenguajes y tdo lo ke sepa lo comparto x amor al arte. Este no es mi trabjo pero lo ago mejor y con +ganas y calidad que si lo fuera, x eso mismo, xq para mi es divertido. Solo spero al menos algo de agradecimientO!! ;)

Dios, qe gusto haber escrito este parrafo cm me a dao la gana sin pensar en ortografia ni tildes ni historias!!!!!