Programación de Juegos para Android

Programación de Juegos para Android 39: Pantalla Game Over

42 videos

238 minutos

Ahora mismo nuestro juego funciona como veis, pero no hay nada de feedback que nos diga que hemos perdido: nos muestra en pantalla un Game Over, pero no es un Game Over que vemos en pantalla, lo vemos en la consola, porque ese Game Over no existe. Estaría bien disponer de una forma que el juego nos diga que hemos perdido de forma que quede claro y que hasta haya un botón para volver a empezar la partida porque ahora mismo no lo hay. Voy a crear una pantalla

secundaria tras esta a la que voy a llamar Game Over que va a mostrar el mensaje y un botón para volver a la pantalla principal. Voy a crear una nueva pantalla como hemos visto hasta ahora llamada GameOverScreen tranquilamente, y esta pantalla va a mostrar un botón y un mensaje que ponga Game Over. El mensaje ya lo tengo diseñado, es esta imagen, pero ¿y el botón? Os explico, Scene2D tiene un módulo llamado Scene2D UI, que sirve para crear

interfaces de usuario. Son actores, y son elementos típicos de una interfaz de usuario como botones, etiquetas de texto, checkboxes, lo que se os ocurra. Mediante Scene2D UI podemos agregar estas cosas sin tener que reinventar la rueda. Sólo necesitamos una forma de darle estilo. Yo voy a usar un skin pero podemos hacer esto de forma manual con styles. Yo voy a usar una skin y para eso voy a usar la skin oficial de libGDX que encontraréis en el repositorio,

que está en la descripción de este vídeo. La misión de la skin es incluir los recursos de los distintos widgets que usa Scene2D UI. Aquí veis que tengo los recursos de los botones, desplegables, checkboxes, menos, mases… los botones que pulsas y cambia el número. Tiene letras para crear letras. ¿Quién va a recortar esto? Ya lo recorta libGDX asumiendo que usemos la clase Skin. Voy a crear la GameOverScreen, de tipo BaseScreen. Va a tener un Stage,

pero no va a tener nada más. Si acaso, una Skin para representar el estilo, una imagen para representar el GameOver, y va a tener un TextButton que es la clase que se ocupa de crear un botón con texto que pueda ser pulsado incluso. Creo el Stage. Creo el Skin, para lo que necesito usar el constructor de Skin, le paso el FileHandle de mi archivo de skin, que es el que termina en .json. Se lo paso como un FileHandle: Gdx.files.internal(), para indicar que queremos

usar un archivo interno de la carpeta assets. Él se ocupa de traducir esto y obtener los recursos necesarios, así que son sólo cargar el principal ya sabe cómo acceder a todo, no pasa nada. Ahora lo que hago es crear mi imagen de GameOver, para lo que en el MainGame he puesto un load en el Manager, a GameOver. Así que escribo que GameOver sea un nuevo Image, y le digo la textura que quiero que use esta imagen. Las imágenes de Scene2D UI muestran una textura como un actor,

así que puede moverse y manipularse. Son muy versátiles, la verdad. Yo le digo Game.Manager.Get(GameOver.png), y se queja porque hasta que no se lo asigno a una variable no puedo saber si es una Texture u otra cosa, así que voy a pasarle un parámetro para obligar al Manager a que sea de una clase completa, por ejemplo Texture.class. De este modo cuando haga los imports, ya es una textura dentro de este método y sale como textura, por eso no da problemas.

Finalmente voy a crear el botón con un nuevo TextButton. Como primer parámetro, le paso la etiqueta de texto y como segundo parámetro el skin. Ahora lo que voy a hacer es, en el show(), mostrar todo esto. Simplemente lo coloco en pantalla, en una posición particular, como gameOver.setPosition(). Esto lo puedo hacer aquí, en el constructor, porque como siempre se va a poner en el mismo sitio, como en la mitad horizontal. En cuanto a retry,

le doy un tamaño al botón de 200x100 para que sea grande, y lo voy a poner en la posición (220,50), para que quede centrado. No necesito show porque como ya lo tengo todo hecho, salvo el add, no pasa nada más. Si acaso necesito un dispose() para hacer un dispose() del Stage. El GameOver no se disposea, porque la textura va por debajo. En cuanto al render, eso sí, lo que necesito es renderizarlo en el Stage, así que voy a copiar sin reparo el código que usaba

para limpiar la pantalla, porque no recuerdo los numeritos y ahora llamo a stage.act() y stage.draw(). Ya veréis que para poder hacer que para que el botón tenga comportamiento debo hacer que se actualice. Finalmente, sustituyo momentáneamente GameScreen por GameOverScreen, y si lo ejecuto veamos el resultado. No queda horizontalmente centrado como esperaba, igual porque me he equivocado aquí. Esto es… que si quieres centrarlo, lo colocas en la mitad del ancho de la pantalla,

menos la mitad del ancho de la textura. Ahora debería verse mejor. Ahora sí funciona bien. Aunque si ahora intento pulsar el botón… no me hace caso. ¿Por qué? Porque tengo que hacer que Scene2D y su Stage trate la entrada para que al hacer clic en el botón lo controle. Vamos a ver cómo hacer esto y terminamos esta pantallita.

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