Programación de Juegos para Android

Programación de Juegos para Android 32: Box 2D y Scene 2D parte 2

42 videos

238 minutos

Recordemos: habíamos creado un PlayerEntity, un Actor. Tenemos que ocuparnos ahora de varias cosas. Primero, de dibujarlo. Os dije que teníamos un problema aquí, porque Box2D y Scene2D trabajan con dimensiones distintas. Box2D trabaja en metros, y Scene2D en píxeles. Os lo voy a explicar con un dibujo. Tenemos nuestra pantallita. Cuando hablábamos de Scene2D os dije que la pantalla debía tener una altura en píxeles. Por ejemplo, 360.

Ya no recuerdo cómo borrar en Skitch. Voy a decirle 360 píxeles de alto. Y luego, cuando hablabamos de Box2D os dije que la altura debía estar en metros, por ejemplo, 4 metros de pantalla. De modo que si dibujo una caja de 1 metro x 1 metro se debe ver… igual esto es muy grande pero imaginemos que ocupa 1 metro. El problema es que esto debe tener altura suficiente para que esto sean 360 píxeles. La pantalla debe medir a la vez 4 metros y 360 píxeles.

La única forma de hacer esto es haciendo que 4 metros = 360 píxeles, de modo que sea una equivalencia. Lo que nos obliga a establecer una conversión entre metros y píxeles. Esto es fácil y se resuelve con una división: si 4 metros son 360 píxeles, 1 metro serán… X píxeles. 360 / 4 = 90 Así que la relación a establecer, es que 1 metro son 90 píxeles. Necesitamos conocer esto porque debemos convertir los metros de Box2D a los píxeles de Scene2D, para poder dibujarlo.

Recordad que no podemos crear bodies de 90 x 90, porque eso serían objetos tan grandes que no respetarían las normas de las físicas que establezcamos. Pero a la vez no podemos hacer actores de tamaño 1 píxel, porque no los veríamos, así que usamos esta equivalencia para poder convertir de metros a píxeles, o de píxeles a metros. Para crear mi relación de equivalencia crearé una clase llamada Constantes, donde crearé una variable llamada PIXELS_IN_METER,

para indicar que en un metro hay 90 píxeles. Y ahora, cada vez que deba posicionar o cambiar el tamaño del actor, deberé modificar los metros que diga Box2D por esta constante para pasarlo a píxeles. Por ejemplo, voy a pasar el tamaño al Actor. Si la caja mide 1 metro, es obvio que su tamaño en píxeles va a ser 1 * Constants.PIXELS_IN_METER. Podría poner ese * 1, pero no me parece necesario. De hecho voy a hacer un import estático para usar esta constante.

Ahora la caja mide 90 x 90 píxeles. Parecido, cuando vayamos a dibujar por pantalla nuestra textura, tenemos que actualizar la posición para que sepamos dónde se debe dibujar a partir de este instante el cuerpo. Aquí es lo mismo. Debo decir que su posición va a ser body.getPosition().x, y body.getPosition().y. No, porque debemos multiplicarlo por el factor de conversión para poder pasarlo a píxeles, que es lo que nos interesa. Y ahora que tenemos todo,

podemos realmente dibujar por pantalla, con el método draw tradicional. Vamos a hacer un último método, necesario ya que estamos, para eliminar la Fixture y el Body, porque lo hemos creado pero recordemos que hay que eliminarlo. Haremos un método llamado detach, para indicar que estamos desacoplando el objeto del mundo. Y este método se ocupará, tanto de destruir la Fixture, como de destruir el Body. Es importante que lo llamemos al final de la vida del juego,

para que desaparezca. Ahora lo que hago es crear un PlayerEntity, instanciarlo… ya veremos qué meto ahí, tranquilos. Lo agrego al Stage… algo que haré en el show(), de hecho, para que siempre se haga. En el hide() tengo que desacoplarlo del mundo. También llamo a remove(), para eliminar el actor del Stage. Y con esto está todo. ¿Qué queda por hacer? Pasar un mundo, una textura, y una posición inicial, que va a ser porque quiero, 1 metro en la posición X y 2 metros en la posición Y.

Me queda sólo por cargar la textura… ¿cómo puedo cargar texturas? Existen formas fáciles de cargar texturas como hemos visto, con el constructor. Pero es poco usable porque cada vez que quiero cargar una textura debo instanciarla. ¿No hay una mejor forma de hacer esto? Sí que existe. Podemos usar AssetManagers para centralizar la carga de recursos.

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