¿Qué hay de las pantallas de menú, game over y esas cosas?. Bien. Allá vamos.
Lo primero es crear una tipografía. La podemos importar dos veces con dos tamaños distintos. Escala 1 para las pantallas intermedias. y escala 0.6 para los marcadores. Iremos creando los estilos de texto sobre la marcha. Podemos crear la carpeta Tipografías para todo esto.
El juego visualiza siempre alguna pantalla, que es un objeto de clase Widget o derivada. Los cambios de pantalla se controlan mediante la máquina de estados general. Aquella referida en el atributo machine del objeto Package actual.
Por ahora no seremos muy ambiciosos. Vamos a tener cuatro pantallas. Menos la del juego, las demás van a contener un simple texto.
Ya tenemos una, que renombraremos como juego. Es la WorldWidget donde sucede la acción.
En la carpeta Pantallas, crearemos.
En cada una de estas tres pantallas añadiremos un objeto de clase TextWidget cuyo atributo text contendrá el texto a visualizar.
Ahora podemos asignar los textos. Por ejemplo: "Pulsa Q para jugar", "GAME OVER" y "¡Bravo!", respectivamente. Y el (TextStyle) que hayamos creado previamente en el atributo text_style.
En el editor veremos representada la pantalla que seleccionemos.
Puede que queramos que el texto aparezca centrado en la pantalla, entonces en el atributo text_align seleccionamos center
, en expand, horizontal
y en el atributo size una altura de 80
.
Repasemos todas las pantallas hasta estar satisfechos.
Volvamos a la máquina de estado global. Ya contiene un estado, el estado del juego. renombrémosle a juego. Ahora crearemos tres estados más, de la clase ScreenState, que llamaremos menu, intermedio y game over. Les asignaremos las pantallas de su mismo nombre.
Como menu es el primero que tiene que ejecutarse lo pondremos en primer lugar en la lista. (Usando el botón . Cada estado debe de tener su atributo screen configurado con la pantalla correspondiente.
Para disparar las transiciones éxito o fracaso desde el juego utilizaremos señales. Estos son objetos de la clase Signal (categoría Comunication) que representan mensajes emitidos de forma indiscriminada. Cualquier otro objeto puede recibirlos si están interesados. Crearemos, en la rama Señales, dos señales llamadas ÉXITO y FRACASO.
Establezcamos las transiciones como las representadas en el gráfico. Cada transición se dispara por una condición de la siguiente manera:
1000
).1000
).Ya sólo nos queda emitir las señales que avisan del éxito o el fracaso en el juego. La idea es comprobar, de vez en cuando, si quedan platillos (si no quedan es un éxito) o si todavía vive el prota, si no vive es un fracaso.
Un momento perfecto es cuando termina la explosión. Crearemos dos estados de clase EmitSignalAction en la máquina de estados de la explosión. Le llamaremos éxito y fracaso y asignaremos su atributo signal(SEND) la señal que le corresponda a cada una.
Añadimos sendas conexiones desde el estado final cada una disparada por una ExpressionCondition (categoría Structural Conditions). Como su nombre indica, esta condición evalúa una expresión cuyo resultado es el valor de la condición. La expresión que utilizaremos será la negación del método countActors de la clase World, que devuelve el número de actores de un carácter que hay en el mundo. En un caso contamos los actores platillo y en el otro los prota.
La función not la obtenemos en el Term Selector, sección Functions, categoría Logical. La función de contexto _WORLD, que devuelve el mundo actual, está, también, en Functions, categoría Context.
La conexión a ActorDeadAction la debemos mover a la última posición, si no, eliminaria la posibilidad de evaluar las dos anteriores.