Programación de Juegos para Android

Programación de Juegos para Android 30: Programar Velocidad

42 videos

238 minutos

Buenas noticias para los puristas: este es el último vídeo en el que el código va a estar así de sucio. Pero antes, hay un asunto que revisar. Vale, ahora mismo tengo el juego así, puedo saltar y todo eso. Pero vaya Geometry Dash más aburrido, el personaje no se mueve. Vamos a ver cómo podemos mover al personaje por pantalla. Para ello antes que nada voy a alejar la cámara un poco, para que veais que si yo cambio sus propiedades por 16:9, he separado algo más

los pinchos, porque me interesa darle algo más de espacio para lo que voy a hacer ahora. Os voy a enseñar cómo podemos hacer para que el personaje se mueva. Tenemos aquí los pinchos y nos interesa que el personaje avance siempre hacia la derecha. La idea, como en el Geometry Dash, es que el personaje salte para evitar llevarse el piñazo. Si toca los pinchos debemos considerar que el personaje ha muerto y la partida ha terminado. Pero debemos buscar una forma de

hacer que se mueva. Para ello, Box2D en la clase Body nos ofrece un método llamado setLinearVelocity, mediante el cual podemos cambiar la velocidad lineal de un Body. Podemos pasarlo como un vector o como las componentes X,Y, pero de alguna forma podemos jugar con la velocidad instantánea del jugador o de cualquier otro cuerpo en un momento determinado. En mi caso me interesa ajustar la velocidad X o la componente X de la velocidad para que siempre

se mueva hacia la derecha. La velocidad Y no me interesa tocarla porque cuando saltamos lo que hacemos es provocar impulsos o fuerzas que modifiquen la velocidad vertical, porque es la única que toco, así que debe quedarse tal cual la componente vertical. Sólo puedo modificar la horizontal. Esto no es difícil de conseguir, debo obtener el valor de la velocidad Y con getLinearVelocity, y luego usar ese parámetro para modificar la velocidad horizontal

y ponerle 8 m/s, manteniendo la velocidad vertical que mantuviese en ese instante, porque como digo que no me interesa. Entre el salto y la actualización del mundo esto va a estar todo el tiempo cambiando y no lo quiero tocar. Pero con este cambio, el personaje ya se moverá. ¿Veis? El único problema es que va muy rápido. Debo tratar esta colisión para que cuando haya chocado deje de moverse porque ya no tiene gracia. Ya hemos perdido, no tiene sentido. Así que aprovechando que

este es el último vídeo antes de la limpieza voy a ensuciar aún más y voy a introducir una variable llamada joeVivo que nos diga si está vivo o no. Mientras siga vivo, lo podemos seguir moviendo. Así que ahora puedo meter este código en un check, de modo que ahora mismo sólo se mueva si está vivo, y lo que puedo hacer es otro contacto para asegurarme que de alguna forma ha chocado con un pincho, y si ha chocado con un pincho detener la animación

y hacer que Joe deje de estar vivo. De nuevo, lo podría hacer con variables de este estilo pero hay formas más limpias de comprobar esto que es mediante un UserData. Con ellos podemos asociar cualquier objeto a cualquier cosa de Box2D, sea un cuerpo, una fixture… para ello, los cuerpos tienen siempre un campo llamado userData. Podemos obtenerlo con getUserData, o modificarlo con setUserData. Y como veis, le podemos pasar un Object, cualquier cosa. Gracias a esto,

podemos asociar cualquier tipo de objeto, sea el que sea, y obtenerlo, lo que podemos usar para obtener y gestionar las colisiones. En mi caso voy a hacer que se le pasen cadenas de caracteres para identificar de qué tipo o categoría es cada cosa. Por ejemplo, minijoeBody va a ser un Player, sueloBody va a ser un Floor, o pinchoBody un Spike. Ahora que lo pienso, dado que las colisiones las hago con Fixtures, tendré que modificar en su lugar,

las Fixtures, no los Body. Así que dejad que cambie esto por Fixture… Y ahora la Fixture de minijoe es un player, la de suelo un floor y la de pincho un spike. Y ahora puedo comprobar de forma más elegante, por actualizar este código: si fixtureA.getUserData().equals(“Player”) && fixtureB.getUserData().equals(“Floor”), o al revés, ya sabéis. que la Fixture A, su userData sea Floor y Fixture B, que su userData sea Player. Dejo esto como estaba, hago un run, y os enseño cómo

detenerlo cuando se choque. … Vale, perdón, si no salto obvio no lo podemos comprobar. Mira qué bien ha saltado. Vale, pues vamos a hacer esto mismo pero ahora cambiando las instancias de floor por spike. Y haciendo que cuando el player choque con un pincho, joeVivo se ponga a falso. Es decir, que deje de moverse. Los resultados son instantáneos, en el instante en el que lo pongo a falso ya no se actualiza la velocidad y se queda clavado. Este es un buen momento para mostrar

una pantalla que ponga “has perdido” o mostrar algo que diga que has perdido, hacer sonar un ruido. Esto es una forma de enseñaros cómo jugar con la velocidad. Veis que es instantáneo. Igual hace un poco de salto pero ya no se mueve más. Esto es como podemos hacer las colisiones entre pinchos para dejar de mover al jugador. Empecemos a organizar esto un poco porque voy a integrar Scene2D.

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!!!!!