Movimiento de fantasmas e I.A.
Primero creamos un solo Sprite, y lo llamamos "Ghost". Este objeto Sprite se utilizará para todos los fantasmas (esta es una solución de versión libre para el plugin "Familias"). En la ventana de cuadros de animación, importa la tira de sprites como antes; eliminar todos los cuadrados sin fantasmas, ajusta la velocidad de la animación a 6 y Loop en Yes. A continuación, duplicar esta animación 18 veces para un total de 19 animaciones. (Sí, leíste bien, diecinueve animaciones en total para el sprite Ghost.) Tradicionalmente, los nombres de los fantasmas son Blinky (el fantasma rojo), Pinky (el fantasma rosa), Inky (el fantasma azul) y Clyde (el fantasma naranja). Así que cambia el nombre de las primeras 16 animaciones a Blinky0, Blinky90, Blinky180, Blinky270, Pinky0, Pinky90, Pinky180, Pinky270, Inky0, etc, hasta Clyde270. También cambiar el nombre de una animación a Vulnerable, otro a VulnerableBlink, y la animación final a Eaten. Para las animaciones específicas nombre de fantasma, borra todos los marcos excepto los correspondientes al nombre de fantasma y dirección de referencia en el nombre de la animación. Por ejemplo, en Clyde90, elimina todos los frames de la animación, excepto los dos que contienen un fantasma naranja mirando hacia abajo. (Si esta explicación es poco claro, por favor ver las animaciones en el archivo capx disponible para su descarga en la Scirra Arcada.) En la animación Vulnerable, sólo mantén los dos frames de la imagen del fantasma con los ojos abiertos de color azul; en la animación VulnerableBlink, mantén los dos frames con el fantasma azul con los ojos abiertos y los dos frames con el fantasma blanco con los ojos abiertos; en la animación Eaten, sólo mantener la imagen de un frame que consta de sólo los ojos.
¡Ahora, la parte divertida comienza!
A continuación, tenemos dos aspectos a considerara: la forma de obtener las direcciones disponibles para un fantasma en cualquier momento, y la forma de seleccionar entre esas direcciones (esta será la parte de Inteligencia Artificial (IA) del programa).
El movimiento del sprite Ghost de baldosa en baldosa será tratado de la misma manera que se manejó el movimiento del PacMan en la parte anterior de este tutorial, por lo que debes añadir el comportamiento de bala al objeto Ghost.
Agrega las siguientes variables de instancia al Sprite Ghost:
Direction, MoveDuration, TargetX, TargetY (todos números). Estos servirán con los mismos fines que los que se hicieron para el sprite PacMan.
Añadir, además, el fantasma de una variable de instancia llamada "GhostName" (texto) y VulnerableTimer (número).
Crea cuatro instancias del sprite Ghost en el diseño principal en cuatro lugares separados (no sobreponiendose en las paredes) y, para cada uno de estos fantasmas, haga clic en ellos y en el panel Propiedades, en la sección Variables de instancia, cambie el nombre de uno de Blinky , el otro a Pinky, el otro Inky, y el último a Clyde.
Para almacenar las direcciones disponibles para un fantasma, hay varias opciones (como una cadena de texto que contiene opciones separadas por comas), pero me parece que es más fácil trabajar con objeto Array debido a toda la funcionalidad que tiene incorporada. Haz clic derecho en el diseño, selecciona "Insert new object", y haga clic en Array. Cambia el nombre a "AvailableDirections" o algo similar. Vamos a utilizarlo como una lista, por lo que será una matriz N por 1 por 1; N será de entre 0 y 4, dependiendo del número de direcciones están disponibles para un fantasma en una posición dada.
En la hoja de evento, crear un nuevo grupo llamado "Ghost Movement"; aquí es donde vamos a incluir todo el siguiente código (de nuevo, por motivos de organización).
A continuación, configura los siguientes eventos, que explicaré más adelante. (Los comentarios son opcionales, pero en general son una muy buena idea para incluir.)
Vamos a usar algunos bucles (estos eventos se encuentran debajo de System) para mantener el número total de eventos manejables. En primer lugar es un bucle for-each - queremos que cada fantasma siga el mismo conjunto de eventos. Debajo de esto está el evento secundario para comprobar si la velocidad de la bala es 0. Si no es cero, entonces el fantasma está en el medio del movimiento y no hay acciones que deban tomarse en este momento. Todo lo que sigue es un evento secundario de esto.
En primer lugar, establecemos el tamaño del array AvailableDirections a (0,1,1). Esto, básicamente, "borra" la lista.
El siguiente es un bucle de Sistema (que no debe confundirse con un bucle for-each). El propósito de esto es para comprobar cada una de las cuatro direcciones (0 grados, 90 grados, 180 grados, 270 grados) para ver si hay una pared en el camino.
Crea una variable global llamada "n" (un número). Esto, de nuevo, es sólo por conveniencia. Vamos a volver a utilizar esta variable con frecuencia. (Si las declaraciones de variables no contaron como eventos, o si no estábamos preocupados por mantener bajo el número de eventos, en vez de eso podrían crean variables locales según sea necesario.)
Hemos establecido el bucle for para comenzar en 0 y terminan a las 3, y en cada juego de paso:
n = 90 * (valor del índice del bucle)
El valor del índice de bucle se obtiene por la expresión loopindex (name_of_loop). Por lo tanto, en este bucle la variable n se enfrentará a los valores 0, 90, 180, y 270. A continuación, con un poco de trigonometría, se establece la posición del sprite CollisionDetector a la plaza adyacente a la posición del fantasma; fijamos
CollisionDetector.X = Ghost.X + cos(n) * TileSize
CollisionDetector.Y = Ghost.Y + sin(n) * TileSize
y comprobamos para ver si el sprite CollisionDetector está solapando con un sprite Wall. Si este no es el caso, entonces la baldosa adyacente en la dirección del ángulo n está disponible para el fantasma para viajar en el siguiente movimiento. Esta información se añade a la lista de direcciones posibles mediante el uso de la matriz de comando "push". Empujamos hacia el "eje X" porque usamos la matriz como una lista, no una cuadrícula. Además, el uso de "push front" o "push back" es irrelevante para nuestros propósitos. Una vez que se calcula esta información, el siguiente paso es seleccionar la dirección en la que un fantasma viajará.
...continuará...
Mientras tanto, siéntase libre de visitar el archivo capx acabado, disponible para su descarga en la Scirra Arcade:
http://www.scirra.com/arcade/example/1217/omnomnomagon-returns