Programación de Juegos para Android

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

42 videos

238 minutos

Como dije, para cargar texturas cómodamente podemos hacer uso de un AssetManager. Es una clase que carga un montón de recursos de golpe y nos deja obtenerlos luego de a pocos. Podemos guardarlo en un repositorio único para no tener que instanciar texturas nuevas todo el tiempo. El Manager lo voy a guardar en Game, porque todas las pantallas tienen acceso al Game a través de la variable. Voy a crear mi AssetManager,

y luego le hago un getter. Con esto puedo acceder al Manager con game.getManager(). Voy a hacer que se carguen todas las imágenes que tenemos aquí, ya veremos cómo cargar música luego. Para ello, voy a hacer en el método create() que se instancie el nuevo Manager. Y luego para cargar los recursos usaremos un método llamado load(). Con load(), que es un método particular, podemos indicarle como parámetro el nombre del recurso que vamos a cargar,

y luego le tenemos que pasar un parámetro de tipo Class… ¿Class? Sí, porque hay que decirle de qué tipo es lo que vamos a cargar, si es una Texture, una TextureRegion, un Sound… Con esto el AssetManager puede determinar qué sistema de carga usar con este recurso, pero hay que decirlo, con Texture.class, por ejemplo. Tengo que repetir esto con cada uno de los recursos, como pueda ser Overfloor, Pinchos y Player. Y para cargarlo todo tenemos que llamar

a FinishLoading(). Con esto se cargará de forma síncrona: todo el juego se detendrá mientras está cargando los recursos. Cuando hagamos múltiples pantallas veremos que podemos hacer una pantalla de carga fluida usando cargas asíncronas, de modo que podamos ver una barra de progreso y ver qué tal va para no poner nervioso al jugador si va a tardar mucho. Para usar esta Textura, todo lo que queda es instanciar mi textura mediante game.getManager(),

para acceder al manager, y luego atención: get. Para obtener un recurso, como pueda ser, player.png. Como he dicho que era de tipo Texture, ya sabe que es una textura, y como lo guardo en una variable de tipo Texture también sabe que debe devolverlo así. Lo único que queda es pasar este playerTexture, y ya le tengo agregado al Stage. Si ahora lo intento representar por pantalla, está perfectamente colocado. ¿Seguro? No del todo. Os voy a enseñar una cosa

que hay que tener en cuenta, y es que cuando hago el draw(), Box2D y Scene2D tienen sus orígenes en posiciones distintas. Os hablé al principio que en Scene2D el origen de coordenadas de los actores está en la esquina inferior izquierda, pero en Box2D está en el centro, así que siempre que vayamos a posicionar algo por pantalla en Scene2D mediante Box2D tenemos que tener en cuenta el offset, precisamente. Lo que voy a hacer es, que aquí cuando establezco la posición,

antes de usar el parámetro de conversión, voy a restar medio metro para colocarlo en la parte izquierda. Y lo mismo verticalmente. Ahora sí, cuando se represente se va a dibujar ahí. Y esto está mejor porque, si yo ahora lo intento dibujar en la posición (0.5, 0.5), aparece automáticamente en la parte inferior completa de la pantalla, porque la resta está bien hecha. Lo único que queda por hacer es, actualizar el mundo de verdad. Le voy a poner donde le toca.

Y simplemente en el render(), antes de llamar a act(), para que le de tiempo… espera. De hecho… voy a meterlo después, para que en act() pueda actualizar fuerzas. Entre act() y draw() voy a llamar a world.step() para poder actualizarlo. Recordad: delta, 6, 2; los parámetros que vimos anteriormente. Con esto estamos en condiciones de ver cómo ocurren cosas. Atentos a esto. Uy, hasta luego. Como estamos actualizando el mundo ya se tiene en cuenta la gravedad.

Y como la gravedad altera su posición, al actualizar el actor siempre se va a dibujar en lo que le diga Box2D que debe dibujarse. Es importante hacerlo en este orden. Usaremos act() primero para introducir fuerzas; después el step() para poder aplicar esas fuerzas y actualizar mundo y gravedad; y finalmente draw() para dibujarlo con los parámetros que hemos calculado. Os dije que el draw() debe ser lo último para evitar que lo que se dibuje no sea

lo que tenga el modelo de físicas, ya que eso puede introducir problemas de jugabilidad. Con esto ya lo tenemos hecho. Si me permitís ahora, antes de empezar el siguiente episodio voy a ir creando las otras entidades que crean con exactamente el mismo código a esto, pero para que no tengáis que ver lo mismo.

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