Por fin ha llegado el momento: ya casi hemos terminado con nuestro juego y estamos listos para implementar la mecánica de juego final. Este artículo se centrará en hacer un sistema combinado que le dé al jugador más puntos por crear cadenas que destruyan varios grupos de bloques después de un solo intercambio..
Además de eso, implementaremos el escenario de pérdida y agregaremos una pantalla de Game Over. Finalmente, hablaré de cosas en las que puedes trabajar en tu propio tiempo para mejorar y expandir el juego más allá de lo que hemos cubierto. Así que, sin más preámbulos, comencemos ...
Aquí está una demostración del juego en el que hemos estado trabajando, y que habremos construido al final de esta parte de la serie:
Antes de pasar al artículo principal, quiero hacer un pequeño cambio a cuándo. FindMatches
se llama.
Mientras trabajaba en este artículo, descubrí un problema que puedes ver en el GIF a continuación:
Como puede ver en este primer GIF, cuando un bloque se cae solo una distancia de bloque para intentar formar una coincidencia con un grupo de bloques en la parte inferior de la caída, funciona perfectamente.
En este segundo GIF, sin embargo, queda claro que cuando un bloque se cae una mayor distancia en el mismo escenario, no puede detectar la coincidencia hasta que realicemos otro intercambio. La razón de esto es que el juego no está buscando coincidencias con la frecuencia suficiente..
En este momento, el juego solo busca coincidencias después de un intercambio, pero debido a la cantidad de tiempo que tarda un Bloque en recorrer esta distancia, la detección de coincidencias ya terminó cuando el Bloque toca el suelo y, por lo tanto, no se encuentra hasta que se reinicia.
Para solucionar esto, modificaremos cuando realicemos un FindMatches
comprobar.
Primero ve al SwapBlocks
Función y eliminar el Evento final de la función para que no llame FindMatches
en absoluto.
SwapBlocks
debería verse así ahora
En este punto, no hay evento de llamada FindMatches
. Arreglaremos esto agregando una nueva acción al evento que detectará cuándo son posibles las coincidencias. Encuentre este evento y agregue esta acción al final del evento Else:
Acción: Función> Nombre de la función de llamada = "FindMatches"
Tu evento ahora debería verse así:
Además, aproveche esta oportunidad para mover ambos MatchesPosible
Eventos hasta el final del código del juego, si aún no lo has hecho. Al hacer esto se asegurará de que no se los llame antes del código que elimina las coincidencias prefabricadas.
Si ejecuta el juego ahora, debería poder realizar el escenario que presenté anteriormente sin problema.
Con ese problema resuelto, vamos a implementar el encadenamiento Sistema, que le da al jugador puntos extra por los partidos causados por la destrucción de otro partido..
Puedes ver un ejemplo del tipo de situación a la que me refiero a continuación:
En el escenario anterior, el jugador mueve el bloque verde y crea una partida. Luego, la destrucción de los bloques verdes hace que los bloques azules se caigan y creen otro momento de partido..
Quiero darle al jugador puntos de bonificación por lograr algo como esto. Específicamente, quiero aplicar un multiplicador a la cantidad de puntos que recibe el jugador por cada partida y aumentar el multiplicador con cada partida consecutiva que se realice..
Para hacer que este sistema funcione, vamos a hacer una nueva variable llamada Cadena
, y luego hacer algunas pequeñas modificaciones a las funciones existentes. Entonces, primero crea una nueva Variable Global:
Variable global: Tipo de cadena = Número Valor inicial = 0
Tu variable debería verse así:
Esta variable actuará como un multiplicador para que los puntos le indiquen cuánto tiempo ha estado pasando una cadena.
Ahora vaya al Evento que causa la caída de los bloques, y elimine el Evento Else que llama al FindMatches
función.
Ahora ve a FindMatches
en sí y encontrar los lugares donde se hace el FloatingPointsText
objetos. Modifique las declaraciones de Set Text para que usen una nueva fórmula:
Acción: FloatingPointsText> Set text Text = NumMatchesFound * 10 * Chain
Este cambio hace que el texto flotante se modifique de la misma manera que los propios Puntos eventualmente.
A continuación, vaya a la sección de FindMatches
donde llamas FindMatches
nuevamente al final del Evento, y elimine esta llamada a la función y la instrucción Esperar. ¿Por qué? Porque, si no los quitamos, entonces FindMatches
terminaría siendo llamado demasiadas veces y las cadenas nunca se iniciarían correctamente.
(Debido a los cambios que hicimos anteriormente en este artículo, FindMatches
se llamará cuando todos los Bloques estén en la cuadrícula y ninguno caiga. Tener áreas múltiples donde llamamos FindMatches
solo causaría que varias instancias de la función se ejecutaran al mismo tiempo, y podría estropear el sistema de puntos.)
Finalmente, haremos otro cambio a esta función. Vaya al final de la función y agregue esta Acción después de configurar Puntos dados
a 0
:
Acción: Sistema> Agregar a variable = Valor "Cadena" = 1
Ahora, cada vez que el juego encuentra coincidencias, le da al jugador puntos, destruye los bloques., y luego aumenta el valor de la cadena.
La nueva versión de FindMatches
debería verse así:
A continuación, vaya a la GivePoints
Funcione y modifique las dos acciones que aumentan el valor de la puntuación para que tengan en cuenta el valor de la cadena:
Acción: Sistema> Agregar a variable = Valor de puntuación = 10 * Cadena
Con este cambio, GivePoints
Ahora debería verse así:
Hemos implementado la variable Cadena como un multiplicador para los puntos que recibe el jugador (y la cantidad de puntos que se muestran en los objetos de texto flotante), pero todavía hay una cosa que debemos hacer: debemos agregar una declaración. que restablece el valor de Cadena para que no se incremente infinitamente.
Vamos a añadir esta declaración a la En DragDrop Start Evento para que, cada vez que el jugador comienza a arrastrar un nuevo Bloque, se considere como una nueva Cadena. La otra razón por la que lo estamos haciendo aquí es porque evita que el valor de la Cadena se restaure prematuramente, haciendo que todas las coincidencias en la última parte de una Cadena sean menos valiosas..
Ve a la En DragDrop Start Evento y añadir esta acción a la lista de acciones:
Acción: Sistema> Establecer valor Variable = Valor de cadena = 1
Tu evento ahora debería verse así:
Si prueba el juego en este punto, debería ver que si hace una cadena como la que demostré en el gif anterior, recibirá 90 puntos en lugar de 60 puntos..
Con ese funcionamiento, el sistema de encadenamiento está completo y debería poder crear una cadena tan elaborada como desee sin problema..
Lo siguiente que quiero cubrir es un problema que he encontrado con el sistema de caída de bloques. Si pasas una gran cantidad de tiempo jugando nuestro juego Match-3 en su estado actual, es posible que hayas notado un problema en el que, de vez en cuando, un Bloque no caerá aunque no haya un Bloque debajo..
Puedes ver lo que quiero decir en la imagen de abajo:
A pesar de que no hay un Bloque debajo del Bloque amarillo, todavía no ha podido caer en el espacio vacío. Este es un problema poco frecuente, pero si no se soluciona, aún podría arruinar la puntuación de alguien y evitar que reciban una cadena que configuraron, o incluso causar que pierdan una vez que agregamos la función Game Over.
El problema viene de la variable. BlockBeingMoved
, que utiliza el Evento que determina cuándo deben caer los Bloques para garantizar que no se mueven Bloques cuando le dice a un Bloque que llene un espacio vacío. En algunos escenarios, cuando el jugador mueve un Bloque, esta variable nunca se restablece, y los Bloques no caen hasta que se mueve otro Bloque y se reinicia correctamente. Para solucionar este problema, agregaremos un par de Eventos que establecerán y restablecerán esta variable correctamente, y eliminaremos las Acciones actuales que configuran la variable, ya que no funcionan correctamente..
Primero, ve a la Inicio OnDragDrop
y En DragDrop Drop
Eventos, y eliminar todas las acciones que se ocupan de la BlockBeingMoved
variable de estos eventos. Debe haber una acción en cada evento que deba eliminarse.
A continuación, vaya al Evento que detecta cuando hay un espacio vacío debajo de un Bloque. Vamos a modificar las condiciones de este evento. Primero asegúrese de que la condición que comprueba si BlockBeingMoved
es igual a 0
esta al principio Luego, agregue otra condición al final del Evento que verifique que no se muevan Bloques.
Esta es la condición que agregará:
Condición: Invertir: Bloquear> Está arrastrando
Tu evento ahora debería verse así:
Finalmente, agregaremos dos eventos más al final del Hoja de eventos que manejará el BlockBeingMoved
variable. Ir al final de tu Hoja de eventos y añadir estos eventos:
Evento: Condición: Bloque> Está arrastrando Acción: Sistema> Establecer variable Nombre = BlockBeingMoved Valor = 1
Evento: Condición: Sistema> Otra acción: Sistema> Establecer variable Nombre = BlockBeingMoved Value = 0
Tus nuevos eventos deberían verse así:
Estos eventos cambiarán efectivamente BlockBeingMoved
desde 0
a 1
y de 1
a 0
cada vez que se mueve un Bloque, o es no siendo movidos, respectivamente. Si prueba el juego en este punto, debería poder jugar tantas veces como quiera sin tener problemas con la caída del Bloque..
Ahora que nuestro sistema de encadenamiento está en su lugar, agregaremos el escenario de pérdida y una pantalla de Game Over.
Lo primero que debemos hacer es agregar un nuevo Diseño que actuará como nuestra Pantalla de Juego:
-6, -7
.613, 619
.303, 200
.Botón de reinicio
.262, 410
.100, 30
.Reiniciar
.Ahora que ya tiene configurada la pantalla Game Over, vuelva a su diseño original, Diseño 1, y agrega un nuevo elemento a esa pantalla:
GameOverArea
.196, -30
.344, 150
.0
.Debes notar que este sprite está en la misma posición y el mismo tamaño que la parte superior del campo de juego. Vamos a utilizar este objeto sprite para detectar cuándo el jugador ha perdido al detectar cuándo un bloque choca con él. Ir Hoja de evento 1 para que podamos empezar a implementar esto.
Antes de comenzar a detectar el escenario de pérdida, debemos agregar una nueva variable que usaremos para detener los bloques cuando lleguen a la GameOverArea Objeto para que ya no se muevan. Esto dejará claro al jugador que ha perdido..
Variable global: Tipo de opción de movimiento = Número Valor inicial = 0
Ahora ve al Evento donde mueves los bloques y agrega esta condición:
Condición: Sistema> Comparar variable Variable = Comparación de movimiento posible = Igual al valor = 0
Tu Evento de movimiento ahora debería verse así:
Ahora que el movimiento usa nuestra nueva variable, agregaremos el Evento que detecta la condición de pérdida:
Evento: Condición: Bloque> Se superpone a otro objeto Objeto = GameOverArea Condición: Invertir: Bloque> IsDragging Acción: Función> Llamar a Nombre de función = "Juego terminado"
El evento que acabamos de realizar llamará a la función Game Over una vez que un Bloque se superponga al GameOverArea
. Ahora haremos el Juego terminado
función.
Evento: Condición: Función> En función Nombre = "Juego terminado" Acción: Bloque> Establecer habilitado Estado = Desactivado Acción: Sistema> Establecer valor Variable = Movimiento Valor posible = 1 Acción: Sistema> Esperar segundos = 1.5 Acción: Sistema> Ir a diseño Disposición = Disposición 2
Tus dos nuevos eventos deberían verse así:
La razón por la que creamos una función independiente en lugar de realizar estas acciones dentro del Evento que realmente detecta el juego, es que este Evento solo está mirando ciertos Bloques debido a los Eventos que lo activan. Como puede ver en la función que realizamos, deshabilitamos las funciones de arrastre del Bloque para evitar que el jugador continúe haciendo coincidencias después de que se detecte el juego. Si hiciéramos esto en el caso de que se detectara el juego, solo se deshabilitarían los Bloques que causaron el juego, y todos los demás Bloques todavía podrían ser arrastrados.
Ahora ve a Hoja de evento 2; Vamos a añadir alguna funcionalidad a la Botón de reinicio Objeto que hicimos antes. Agrega un nuevo evento a Hoja de evento 2:
Evento: Condición: RestartButton> On Clicked Action: System> Ir a la disposición Diseño = Diseño 1
Su evento debe verse así:
Si juegas el juego ahora, recuperas el juego y luego reinicias, deberías notar que vuelve al diseño original, pero los bloques no se mueven. La razón de esto es que todas las variables que hemos estado usando son variables globales, por lo que algunas de ellas no se restablecen automáticamente cuando reiniciamos el diseño..
Para restablecerlos, necesitamos agregar una Acción a nuestro En inicio de diseño Evento que los resetearemos manualmente por nosotros..
Ve a la En inicio de diseño Evento y agregue esta acción al evento inicial antes de llamar a los bucles For:
Acción: Sistema> Restablecer variables globales.
Tu evento ahora debería verse así:
Si vuelve a realizar la prueba, ya no debería tener este problema..
En este punto, hemos revisado todas las características que quería cubrir dentro del alcance de estos tutoriales..
Notarás que tu juego aún no está exactamente igual que en la demo anterior, con la mayor diferencia de que tu juego no tiene una pantalla de Inicio. Elegí no repasar la creación de la pantalla de inicio, ya que es casi exactamente lo mismo que crear la pantalla de juego final: te dejo esto como un ejercicio.
En su lugar, voy a discutir algunas características que podría considerar agregar a su juego que podrían hacerlo mejor o más interesante..
Lo primero que quiero discutir son los bloques especializados: bloques que otorgan bonos al jugador o realizan alguna función única.
La mayoría de los juegos de Match-3 incluyen bloques especializados para ayudar a romper la acción y hacer que el juego sea más emocionante. Tal como está, el juego puede continuar teóricamente para siempre, pero el juego nunca cambia. La introducción de tipos de bloques especiales de vez en cuando puede ayudar a que el juego sea más interesante cuando ha estado funcionando durante un tiempo..
Para integrar un bloque de especialidad, deberá cambiar la forma en que se generan los bloques, de modo que cada vez que se crea un bloque hay una posibilidad aleatoria de que se convierta en un bloque de especialidad. Hay varias formas de hacerlo, pero generalmente es mejor generar solo un número aleatorio entre 1 y 100 y solo generar un bloque de especialidad cuando el valor aleatorio está entre 95 y 100, o algún otro rango que decida.
Tu objetivo debe ser hacer bloques especiales raros, pero no también raro. De esta manera, el jugador los obtendrá con la suficiente regularidad para hacer que el juego sea más divertido, pero no tan a menudo que destruya el equilibrio del juego..
Cuando se trata de bloques de especialidades tienes muchas opciones; uno de los mas comunes es un bloque de bomba.
Los bloques de bombas causan que bloques adicionales se destruyan cuando se destruyen. Son diferentes en cada juego: en algunos juegos, destruyen todos los Bloques que los rodean; En otros, destruyen toda una fila o columna de bloques..
En la imagen de abajo, puedes ver dos de los tipos de bloques de bombas del popular juego Candy Crush saga:
Los bloques de bombas son generalmente bastante simples de integrar:
Otro tipo de bloque de especialidad que encontrarás en muchos juegos es uno que reduce la velocidad de movimiento de los Bloques o los detiene por completo..
Bloques como estos son muy simples de hacer.
MovimientosPosible
a 1
para que los bloques se detengan, o modifiquen la velocidad
para que los bloques se muevan muy despacio.Debe recordar tener en cuenta que el jugador activó un bloqueo de tiempo mientras que otro bloque de tiempo ya está activo. En este escenario, debe reiniciar el temporizador o agregar la longitud estándar del temporizador al temporizador existente y continuar normalmente.
También puedes considerar agregar otros modos de juego para cuando el jugador se aburra del modo Sin fin que creamos.
El modo de juego más fácil de agregar es uno en el que el jugador tiene un límite de tiempo, con el objetivo de conseguir tantos puntos como sea posible antes de que se acabe el tiempo..
En este escenario, dejaría todo el código del juego sin tocar, excepto para agregar una segunda condición de pérdida al juego, por lo que el juego termina cuando el temporizador se agota (así como cuando los Bloques llegan a la parte superior de la pantalla).
Cuando el juego comienza, comenzarás un cronómetro durante el tiempo que dure el modo, y cuando el cronómetro finalice, terminarás el juego de la misma manera que lo haces ahora..
En este modo de juego, le darías al jugador un tablero de juego muy específico que diseñas por adelantado y le pedirás que elimine todos los bloques en la menor cantidad de intercambios posibles..
(Probablemente querrá desactivar el movimiento del bloque, ya que si los bloques se están moviendo, también se agregarán nuevos bloques con el tiempo).
Este modo requiere que puedas configurar una cuadrícula de bloques específica, por lo que deberías tener un sistema que te permita pasar a una configuración de bloques específica cuando el juego comience en lugar de generar uno completamente al azar como lo hacemos ahora..
Además de esto, aunque este modo de juego sería relativamente fácil de implementar, requeriría que realices muchos diseños de rompecabezas manuales para que puedas crear muchos rompecabezas únicos para que el jugador los intente y los resuelva..
Agregar un modo de juego como este puede llevar bastante tiempo debido a la creación de todo el contenido requerido, pero hay muchos jugadores que lo disfrutarían. Realmente puede valer la pena si pones el tiempo.
En el transcurso de esta serie de tutoriales, creamos un juego de combinaciones de 3 enteros de principio a fin. Hay mucho más que puedes hacer con este juego si te tomas el tiempo y tienes la imaginación, pero también hay muchas formas en que puedes usar las ideas que presenté para ayudarte con otros proyectos de juegos..
Sigue trabajando en tu juego y sigue explorando nuevas ideas, porque nunca sabes cuándo algo que aprendiste aquí podría ser útil más adelante.
Espero que, ya sea que hayas revisado toda la serie o simplemente hayas salteado las partes que no pudiste hacer por tu cuenta, aprendiste algo de esto. Si tiene algún problema o comentario, háganoslo saber en las discusiones debajo de cada artículo. Me encantaría saber de usted y ver qué giros agregará. En cualquier caso, gracias por leer y buena suerte con tus juegos.!