Añadiendo un enemigo
Es de esperar que ahora esté familiarizado con el proceso de añadir sprites y animaciones. Así que para la concisión no se repetirán los pasos completos de nuevo. Vamos a añadir un nuevo sprite de un enemigo.
1. Añadir un nuevo objeto Sprite en el layout.
2. Importar la franja de sprites Enemies\Snail .
3. Eliminar el primer frame de la animacion.
4. Establecer loop a la animacion y speed 15.
5. Establecer el origen hasta la base de la imagen del caracol, y aplicarla a toda la animación.
6. Corta todos los frames (shift + crop).
7. Cierra el editor de animación y cambia el nombre al objeto por 'SnailEnemy'.
8. Colocalo en un tile de suelo como se muestra.
Ahora queremos implementar la siguiente lógica:
- Si el jugador corre hacia el caracol, parpadeara y el jugador saldrá herido.
- Si el jugador brinca encima del caracol, el caracol es eliminado.
Para hacer que el jugador parpadee, selecciona al jugador y agrega el comportamiento Flash. Recuerda seleccionar al verdadero jugador, no al objeto PlayerBox (pues es el jugador visible que queremos que parpadee). Vamos a utilizar la acción 'Flash' de éste comportamiento en un momento.
Cambia a la visualización del event sheet y agrega un nuevo evento:
PlayerBox -> On collision with another object -> SnailEnemy
Éste evento se ejecuta cuando colisionamos con el objeto SnailEnemy en cualquier angulo. Podemos entonces usar sub-events para probar si el jugador esta brincando por encima o corriendo por un lado. Vamos primero a probar si el jugador ésta encima.
Agrega un sub evento al evento de colisión.
PlayerBox -> Is falling
También debemos probar si el jugador está realmente encima del enemigo. Ésto va a evitar que el caracol muera accidentalmente si caemos atravesando uno de bordes. Click drecho en la condicion 'is fallin' y selecciona 'Add another condition'. Recuerda, todas las condiciones deben cumplirse para que el evento se ejecute. Agrega una condición:
PlayerBox -> Compare Y -> Less than, SnailEnemy.Y
La posición Y aumenta hacia abajo, así que si la coordenada Y del personaje es mejor que la del caracol, entonces está encima de él.
En éste evento, agrega la acción:
SnailEnemy -> Destroy
También podemos hacer que el jugador rebote en él al agregar otra acción:
PlayerBox -> Set vector Y -> -700
Básicamente 'Set Vector Y' solo establece una velocidad vertical del movimiento de plataforma; establecerlo en un valor negativo lo moverá hacía arriba (otra vez, la posición Y aumenta hacia abajo), y 700 es un poco menos que la fuerza del salto de 1100. Así que esto hará que el personaje rebote como si su salto fuera débil.
No hemos terminado: da click derecho en el margen del evento 'is falling' (el espacio justo a la derecha del icono de PlayerBox) y selecciona Add -> Else. 'Else' es una condición especial que se ejecuta si el anterior evento no lo hace. Así que éste evento va a ejecutarse si colisionamos con el caracol pero no estamos saltando por encima de él - si no más bien que colisionamos por un lado. En el evento queremos que el jugador sea herido. Agregar la acción
Player -> Flash -> (dejar los valores por defecto y dar click en Done)
Recuerda que el comportamiento Flash está en el objeto Player, no en PlayerBox.
Bien, entonces el jugador nunca morirá, sólo parpadeara. Pero tenemos la detección para saber si salto encima o corrió por un lado. Éste tutorial no cubrirá todo aspecto, pero esperamos que puedas ver dónde crear efectos de muerte (intenta creando un sprite de 'prueba' en el objeto SnailEnemy cuando éste sea destruido, usando la acción de SnailEnemy 'Spawn object') y dónde restar vida (en el evento que hace que el jugador parpadee - puedes aprender acerca de la vida utilizando variables de instancia en el tutoial top-down shooter tutorial querrás echarle un vistazo después de terminar).
Vamos a hacer que el enemigo caracol se mueva de lado a lado en la plataforma.
Moviendo el enemigo
El principal problema con mover al caracol es coomo detectar cuando éste alcance el borde de la plataforma. La manera más sencilla de hacerlo es con marcadores de 'borde' invisibles. Son simplemente sprites invisibles que dan la vuelta a la dirección del caracol cuando las toque.
Podemos también utilizar el comportamiento plataforma otra vez con el caracol. Es conveniente porque:
- Puede moverse de izquierda a derecha
- Puede subir y bajar plataformas justo como el personaje puede hacerlo.
- Puede caer fuera de los bordes si tu lo deseas.
- Si quieres que tu enemigo brinque, puedes hacer que brinque automáticamente también utilizando la acción 'simulate control'.
Agregar el comportamiento Platform al sprite SnailEnemy. Ya que no estamos usando animaciones complicadas en éste objeto, podemos utilizar directamente el comportamiento en el objeto sin agregar un objeto 'caja' invisible. Toma en cuenta que si tu haces un juego de plataforma distinto con enemigos con animaciones complicadas, deberías utilizar la misma tecnica de la caja que utilizamos con el jugador.
No queremos que el jugador controle a SnailEnemy - queremos que automáticamente sea controlado. Podemos hacerlo al establecer la propiedad Default controls en No
yentonces utilizar la acción Simulate control. Debido a que los caracoles son muy lentos, establece la propiedad Max speed en 50 y Acceleration y Deceleration* en 100.
También necesitamos los marcadores de 'bordes'. Agrega un nuevo objeto Sprite y simplemente agrega un rectángulo opaco. Llamalo EdgeMarker. El tamaño del objeto es cerca de 40 x 40 y establece la propiedad Initial Visibility en Invisible así no lo veremos durante el juego. Coloca cada uno en en los bordes de la plataforma del caracol, como a continuación:
El caracol también necesita saber de qué manera se está moviendo actualmente - sea izquierda o derecha. Podemos hacerlo con variables de instancia. Son simples números y textos almacenados en cada instancia del objeto. Esto permite que tengan valores únicos para su vida, dirección actual, etc. Una técnica simple para controlar enemigos es crear una variable de instancia "action" que controla el estado actual. Por ejemplo, éste puede ser "huir", "cazar jugador" o incluso "en descanso". En éste caso solo necesitamos "izquierda" y "derecha", pero es útil configurarlo de la misma manera.
Selecciona el objeto SnailEnemy. En la barra de propiedades, da click en Add / Edit abajo de 'Instance variables'.
Un dialogo mostrando todas las variables de instancia del objeto aparece. Da click en el icono de 'agregar' para agregar una nueva. Inserta action como nombre, establece type en text, y el valor inicial en right (para mover a la derecha).
Click en *OK y cierra el dialogo de variables de instancia. Cambia event sheet.
Queremos implementar la siguiente lógica:
- Si action es right, simulará el movimiento de plataforma de la tecla 'derecha' para mover al caracol a la derecha.
- Si action es right, simulará el movimiento de plataforma de la tecla 'izquierda' para mover al caracol a la izquierda.
También:
Si el caracol impacta con EdgeMarker, voltea su variable action (si choca con la "izquierda" lo establece a la "derecha"; si impacta con la "derecha" lo establece hacia la dirección izquierda).
Podemos establecer los movimiento con los siguientes dos eventos:
Evento: SnailEnemy -> Compare instance variable -> action equal to "right" (utiliza comillas dobles aquí para indicar texto)
Acción: SnailEnemy -> Simulate control -> Right
Debería ser igual de fácil hacerlo lo mismo para la derecha. También queremos que la imagen haga espejo hacia la izquierda y derecha justo como lo hicimos con el jugador. Así que agrega SnailEnemy -> Set Mirrored en el evento "left", y SnailEenemy -> Set not mirrored en el evento *izquierda. Deberás finalizar con algo así:
Ahora voltea las direcciones del caracol en los bordes:
Eventos: SnailEnemy -> On collision with another object -> EdgeMarker
Sub-evento: SnailEnemy -> Compare instance variable -> action equal to "right"
Acción: SnailEnemy -> Set value -> action to "left"
Sub-evento: Else
Acción: SnailEnemy -> Set value -> action to "right"
Es importante utilizar Else aquí, porque los eventos se ejecutan de arriba hacia abajo. Si en lugar de 'else' decimos 'action equeal to "left"', no tendrá ningún efecto pues el evento se ejecutará después del otro y el movimiento volvería a su misma dirección. Al usar 'else', prevenimos que el segundo evento se ejecute si el primero era verdadero.
Ejecuta el proyecto. Te darás cuenta que el caracol se está moviendo hacia atrás y hacia delante en su plataforma. ¡Esto hace que sea más difícil saltar en él! Esto es un sistema 'IA' bastante rudimentario, pero esperamos que puedas imaginar cómo puedes crear unos enemigos más inteligentes al controlar los movimientos con más eventos, posiblemente permitiendo que ellos caígan de los bordes, o utilizando otros marcadores para activar un salto y lograr dar el efecto de que el enemigo sabe brinca a una plataforma.
Intenta crear una plataforma con dos caracoles en él. Te darás cuenta que cada uno se controla individualmente del otro, ya que cada uno tiene su propia variable de instancia action que lleva su propio estado actual. Esperamos que puedas empezar a ver lo importante que son las variables de instancia para controlar instancias independientemente - ¡no todos tienen que hacer la misma cosa que cada uno!