Programación de Juegos para Android

Programación de Juegos para Android 20: Box 2D

42 videos

238 minutos

Os he enseñado ya cómo hacer esto de las colisiones usando bounding boxes, pero sé que no es lo más apropiado. Sé que igual no es lo más bonito de escribir y lo más manejable, así que vamos a ver un sistema mejor que os va a gustar más y que es el que vamos a usar, que es Box2D. Esa librería que sirve para simular físicas 2D, como la gravedad, colisiones, acciones, fuerzas, cosas que saltan, que se mueven a velocidades… todo eso nos lo deja hacer Box2D

y no lo tenemos que hacer nosotros, y eso está bien. Como su nombre indica, Box2D sólo sirve para físicas 2D. Con esto vale, porque hacemos que el jugador avance izquierda derecha, pero en un mundo 3D no quedaría bien. Por eso funciona bien aquí pero no siempre. Como Box2D tiene su propio sistema de código, voy a cambiar a una pantalla nueva que va a ser creada ahora. Y luego veremos cómo combinar lo que hagamos con Box2D con lo que hemos hecho con Scene2D,

que es donde está lo bonito. Por ahora voy a crear una pantalla vacía de tipo BaseScreen, y voy a crear el constructor directamente. Esta pantalla necesita, como cualquier tipo de pantalla, que carguemos cosas, ahora veremos qué hay que cargar. También habrá que… eliminar cosas, que lo haremos en el dispose(). Vamos a tener que renderizar cosas, obviamente. Y yo diría que nada más, pero ya veremos según cómo evoluciona la cosa. Comenzaremos haciendo un clear,

porque nos interesa comprobar que esto funciona: ya sabéis que si no ponemos el clear, pueden ocurrir cosas muy raras. Veamos si esto se ve negro, y si se ve negro, estupendo. ¿Cómo empezaríamos trabajando con Box2D? Os va a sonar raro pero lo primero que vamos a hacer es crear un mundo: así, como quien no quiere la cosa. No creas mundos todos los días. Voy a crear una instancia de World, llamada world. Afortunadamente el JDK no trae nada llamado World

así que con hacer un import a la clase de badlogic basta. Vamos a instanciar el mundo, y voy a pasarlo con el constructor. ¡Hagase el mundo! Necesita dos parámetros: la gravedad y un booleano llamado doSleep. Voy con la gravedad. No sé cuándo fue la última vez que cogísteis un libro de física, espero no sea hace mucho, pero sabéis que en el mundo, y en todo el universo, hay gravedad. En nuestro planeta, -9.81 j m/s. Esta es la fuerza de atracción

que ejerce la tierra sobre los cuerpos, que hace que caigan hacia abajo… el caso, es que Box2D tiene su propia gravedad, y además nos deja poner la gravedad que nos interesa, incluso permitiendo gravedad hacia arriba, abajo, bordes, esas cosas que irían contra la física de nuestro mundo, en Box2D es posible porque es nuestro centro de creatividad. No obstante, como la creatividad la hemos dejado en casa, voy a pasar un Vector que tenga una gravedad como la de la tierra.

X=0, Y=-9.81. Para que no haga tanto cálculo con flotantes voy a decirle -10 y no se va a notar la diferencia. El segundo parámetro le voy a decir un true. ¿Por qué? Porque doSleep es un parámetro que sirve para indicarle al sistema que cuando no hay nada que simular, no haga nada, lo cual está bien porque ahorra tiempo de CPU. Hay motivos para no darle true, pero para lo que nos toca, nos conviene pasarle true. World es una clase disposeable así que no os olvidéis

llamar a dispose. Ahora, una vez tenemos el mundo creado, lo vamos a simular. Para simular un mundo, tendremos que llamar en el render, que para eso es el método que se va a ejecutar 60 veces por segundo, a step. Tiene dos parámetros: timeStep, que sirve para indicar cuánto tiempo tenemos que simular. Por el momento voy a pasar delta, pero luego os hablaré de por qué esto no es una buena idea. Y finalmente, velocityIterations y positionIterations,

que sirve para decir cuántas veces hay que iterar por frame. Cuanto más alto sea el valor, mejor se simulará pero más tiempo de CPU que vamos a usar. Aquí voy a proporcionar los parámetros 6 y 2. ¿Por qué? En parte porque lo dice la documentación. Pero ¿y por qué? Pues porque nadie explica para qué sirve, así que ni yo lo sé. La documentación de Box2D supuestamente explica más pero creedme, no lo explica. Vamos a usar 6 y 2 porque nos lo creeremos, pero todo lo que

sé es que cuanto más alto, peor rendimiento tendrá aunque mejor se iterará. Ya tenemos nuestro mundo creado. Vamos a verlo, a ver qué hace. Qué oscuro está todo, ¿no? Bueno, porque falta algo para que se vea el mundo. Y además, faltan por meter las cosas. Así que vamos a resolver uno a uno estos problemas.

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