Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. From Scratch
Gamedevelopment

Hacer un juego Match-3 en Construct 2: Encadenamiento y Game Over

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Make a Match-3 Game in Construct 2.
Make a Match-3 Game in Construct 2: Eliminating Pre-Made Matches

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

El tiempo ha llegado finalmente: estamos a punto de terminar con nuestro juego, y estamos listos para implementar el mecánico de juego final. Este artículo se centrará en hacer un sistema combinado que le da al jugador más puntos para crear cadenas que destruyen varios grupos de bloques después de solo un intercambio.

Además de eso, implementaremos el escenario de pérdidas y agregaremos una pantalla de Game Over. Por último, hablaré sobre cosas en las que puede trabajar en su propio tiempo para mejorar y ampliar el juego más allá de lo que hemos cubierto. Así que, sin más preámbulos, vamos a empezar ...


Demostración final del juego

Esta es una demostración del juego al que hemos estado trabajando y que habremos construido al final de esta parte de la serie:




Encontrando Coincidencias

Antes de pasar al artículo principal, quiero hacer un pequeño cambio cuando FindMatches se llama.

Mientras trabajaba en este artículo, descubrí un problema que puedes ver en el GIF a continuación:

Match-3 Construct 2 tutorial

Como se puede ver en este primer GIF, cuando un bloque se deja caer a una distancia de un bloque para intentar formar un partido con un grupo de bloques en la parte inferior de la caída, funciona perfectamente.

Match-3 Construct 2 tutorial

En este segundo GIF, sin embargo, queda claro que cuando un bloque se deja caer una mayor distancia en el mismo escenario, no logra detectar el partido hasta que realizamos otro intercambio. La razón de esto es que el juego no está buscando partidos con suficiente frecuencia.

En este momento, el juego sólo busca coincidencias después de un intercambio, pero debido a la cantidad de tiempo que tarda un bloque en caer esta distancia, la detección de coincidencias ya ha terminado cuando el bloque toca el suelo y por lo que el partido no se encuentra hasta Se vuelve a iniciar.

Para corregir esto, lo modificaremos cuando realicemos una comprobación FindMatches.

Primero ve a la función SwapBlocks y elimina el Evento final de la función para que no llame a FindMatches.

SwapBlocks debería verse así ahora:

Match-3 Construct 2 tutorial

En este momento, no hay ningún evento llamando a FindMatches. Solucionaremos esto añadiendo una nueva Acción al Evento que detecte cuándo son posibles los Partidos. Encuentre este evento y agregue esta acción al final del otro evento:

Su evento ahora debería verse así:

Match-3 Construct 2 tutorial

Además, aprovecha esta oportunidad para mover ambos eventos de MatchesPossible al final del código del juego, si aún no lo has hecho. Hacer esto se asegurará de que no se llaman en absoluto antes de que el código que elimina los partidos pre-hechos.

Si ejecuta el juego ahora, debería ser capaz de realizar el escenario que he presentado anteriormente sin problema.


Encadenamiento

Con ese problema resuelto, vamos a implementar el sistema de encadenamiento, que le da al jugador puntos extra para los partidos que son causados por la destrucción de otro partido.

Puedes ver un ejemplo del tipo de situación que quiero decir a continuación:

Match-3 Construct 2 tutorial

En el escenario anterior, el jugador mueve el bloque verde y crea una coincidencia. Entonces, la destrucción de los bloques verdes hace que los bloques azules se caigan y creen otro partido momentos después.

Quiero dar a los jugadores puntos de bonificación para lograr algo como esto. Específicamente, quiero aplicar un multiplicador al número de puntos que el jugador recibe para cada partido, y hacer que el multiplicador aumente con cada partido consecutivo que se haga.

Haciendo que funcione

Para hacer que este sistema funcione, vamos a hacer una nueva variable llamada Chain, y luego hacer algunas pequeñas modificaciones a las funciones existentes. Por lo tanto, primero cree una nueva variable global:

Su variable debe tener este aspecto:

Match-3 Construct 2 tutorial

Esta variable actuará como un multiplicador para los puntos para decirle cuánto tiempo una cadena ha ido.

Ahora vaya al evento que hace que los bloques caigan y elimine el evento Else que llama a la función FindMatches.

Ahora vaya a FindMatches y encuentre las ubicaciones en las que haga los objetos FloatingPointsText. Modifique las instrucciones Set Text para que utilicen una nueva fórmula:

Este cambio hace que el texto flotante se modifique de la misma manera que los puntos mismos eventualmente.

A continuación, vaya a la sección de FindMatches donde llame FindMatches de nuevo al final del Evento y elimine esta llamada de función y la sentencia Wait. ¿Por qué? Porque, si no eliminamos estos, entonces FindMatches terminaría siendo llamado demasiadas veces y las cadenas nunca serían iniciadas correctamente.

(Debido a los cambios que hicimos anteriormente en este artículo, FindMatches se llamará cada vez que todos los bloques están en la cuadrícula y ninguno está cayendo.Teniendo múltiples áreas donde llamamos FindMatches sólo causaría múltiples instancias de la función que se ejecuta al mismo tiempo , Y podría estropear el sistema de puntos.)

Finalmente, haremos otro cambio a esta función. Ir al final de la función y añadir esta acción después de establecer PointsGiven a 0:

Ahora, cada vez que el juego encuentra partidos, le da al jugador puntos, destruye los bloques, y luego aumenta el valor de la Chain.

La nueva versión de FindMatches debería tener este aspecto:

Match-3 Construct 2 tutorial

A continuación, vaya a la función GivePoints y modifique ambas Acciones que aumentan el valor de la Puntuación para que tengan en cuenta el valor de la Cadena:

Con este cambio, GivePoints ahora debe verse así:

Match-3 Construct 2 tutorial

Restablecimiento de la cadena

Hemos implementado la variable Chain como un multiplicador para los puntos que el jugador está recibiendo (y el número de puntos que se muestran en los objetos de texto flotante), pero todavía hay una cosa que tenemos que hacer: tenemos que añadir en una declaración Que restablece el valor de Chain de modo que no sólo aumentará infinitamente.

Vamos a agregar esta declaración al Evento On DragDrop Start para que, siempre que el jugador comience a arrastrar un nuevo Bloque, se considere como una Cadena nueva. La otra razón por la que lo estamos haciendo aquí es porque evita que el valor de la Cadena sea restablecido prematuramente, haciendo así que todos los fósforos en la última parte de una Cadena sean menos valiosos.

Vaya al evento On DragDrop Start y agregue esta acción a la lista de acciones:

Su evento ahora debería verse así:

Match-3 Construct 2 tutorial

Si usted prueba el juego en este punto usted debe ver que si usted hace una cadena como la que demostré en el GIF más temprano, usted recibe 90 puntos en vez de 60 puntos.

Con ese trabajo, el sistema de encadenamiento está completo y usted debe ser capaz de crear una cadena tan elaborada como desee sin problema.


Arreglando la caída

La siguiente cosa que quiero cubrir es un problema que he encontrado con el sistema de caída de bloques. Si pasas una cantidad importante de tiempo jugando nuestro juego de Match-3 en su estado actual, es posible que hayas notado un problema donde, de vez en cuando, un bloque fallará al caer aunque no haya ningún bloque bajo él.

Puedes ver lo que quiero decir en la imagen de abajo:

Match-3_Game_Construct-2_BrokenFalling

A pesar de que no hay bloque debajo del bloque amarillo, todavía no ha podido caer en el espacio vacío. Este es un problema raro, pero si no se trata, todavía puede estropear la cuenta de alguien y evitar que reciban una cadena que configuran, o incluso hacer que pierdan una vez que agregamos la función Game Over.

El problema proviene de la variable BlockBeingMoved, que es utilizada por el evento que determina cuando los bloques deben caer para asegurarse de que no hay bloques que se mueve cuando se le dice a un bloque para rellenar 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 mueva otro bloque y se restablezca correctamente. Para corregir esto, vamos a agregar un par de eventos que establecerán y restablecerán correctamente esta variable, y eliminaremos las acciones actuales que están estableciendo la variable, ya que no funcionan correctamente.

En primer lugar, vaya a los eventos OnDragDrop Start y DragDrop Drop, y elimine todas las acciones que tratan con la variable BlockBeingMoved de estos eventos. Debe haber una Acción en cada Evento que deba eliminarse.

A continuación, vaya al evento que detecta cuándo 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 es al principio. A continuación, agregue otra condición al final del evento que comprueba para asegurarse de que no se mueven bloques.

Esta es la condición que agregará:

Su evento ahora debería verse así:

Match-3_Game_Construct-2_ModifiedBlockFalling

Por último, vamos a añadir dos eventos más al final de la hoja de eventos Event Sheet que se encargará de la variable BlockBeingMoved. Vaya al final de su hoja de eventos Event Sheet y agregue estos eventos:

Sus nuevos eventos deben tener este aspecto:

Match-3_Game_Construct-2_BlockBeingMovedEvent

Estos eventos cambiarán efectivamente BlockBeingMoved de 0 a 1 y de 1 a 0 cada vez que se mueva un bloque o no se mueva, respectivamente. Si prueba el juego en este punto, debería poder jugar tantas veces como desee sin encontrar ningún problema con el bloqueo.


Game Over

Ahora que nuestro sistema de encadenamiento está en su lugar, vamos a agregar el escenario de pérdida y una pantalla de Game Over.

Lo primero que tenemos que hacer es agregar un nuevo Layout que actuará como nuestro Game Over:

  1. En el lado derecho de la pantalla, haga clic con el botón derecho en la carpeta Layouts y seleccione Add Layout.
  2. Seleccione Add Event Sheet.
  3. Vaya al nuevo Layout y cree un nuevo objeto BG Tile.
    1. Elija la imagen GameOverBGTile.png de la carpeta BG Images del paquete de gráficos que descargó durante el primer tutorial.
    2. Establezca la Position en -6, -7.
    3. Establezca el tamaño Size en 613, 619.
  4. Cree un nuevo objeto Sprite.
    1. Elija la imagen GameOverText.png del paquete de gráficos.
    2. Establezca la Position en 303, 200.
  5. Cree un nuevo objeto Button.
    1. Establezca el nombre Name a RestartButton.
    2. Establezca la posición Position a 262, 410.
    3. Establezca el tamaño Size en 100, 30.
    4. Establezca el texto Text a Restart.

Ahora que tiene configurada la pantalla Game Over, vuelva a su Layout original, Layout 1 y agregue un elemento nuevo a esa pantalla:

  1. En Layout 1, cree un nuevo objeto Sprite.
  2. Utilice la herramienta Cubo de pintura Paint Bucket para pintar este sprite completamente rojo.
  3. Cierre el editor de animación.
  4. Establezca el nombre Name a GameOverArea.
  5. Establezca la Posición Position en 196, -30.
  6. Establezca el tamaño Size en 344, 150.
  7. Establezca la Opacidad Opacity en 0.

Usted debe notar que este sprite está en la misma posición, y el mismo tamaño, como la parte superior del campo del juego. Vamos a utilizar este objeto sprite para detectar cuando el jugador ha perdido por la detección de cuando un bloque está chocando con él. Vaya a la Event Sheet 1 para que podamos empezar a implementarla.

Detener los bloques en la parte superior

Antes de comenzar a detectar el escenario de pérdida, necesitamos agregar una nueva variable que usaremos para detener los bloques cuando golpean el objeto GameOverArea para que ya no se muevan. Esto le dejará claro al jugador que han perdido.

Ahora vaya al evento donde mueva los bloques y agregue esta condición:

Su evento de movimientos debería tener el siguiente aspecto:

Match-3 Construct 2 tutorial

Ahora que el movimiento usa nuestra nueva variable, agregamos el Evento que detecta la condición de pérdida:

El Evento que acabamos de hacer llamará a la función de Juego Sobre una vez que un Bloque se sobreponga a la GameOverArea. Ahora vamos a hacer que la función GameOver.

Sus dos nuevos eventos deben tener este aspecto:

Match-3_Game_Construct-2_GameOverEvents

La razón por la que creamos una función independiente en lugar de realizar estas acciones dentro del Evento que detecta realmente el juego, es que este Evento sólo está mirando determinados Bloques debido a los Eventos que lo activan. Como se puede ver en la función que hemos realizado, desactivamos las funciones de arrastrar del bloque para evitar que el jugador continúe haciendo coincidencias después de que se detecte el juego. Si lo hicimos en el evento que detecta el juego, solo desactivaría los Bloques que causaron el juego, y todos los demás Bloques todavía podrían ser arrastrados.

Ahora, vaya a la Event Sheet 2; Vamos a añadir alguna funcionalidad al objeto RestartButton que realizamos anteriormente. Agregar un nuevo evento a la Event Sheet 2:

Su evento debe tener este aspecto:

Match-3 Construct 2 tutorial

Restablecimiento de los valores

Si usted juega el juego ahora, consigue un juego encima, y después recomienza, usted debe notar que va de nuevo al Layout original, pero los bloques no se están moviendo. La razón de esto es que todas las variables que hemos estado utilizando son variables globales, por lo que algunas de ellas no se restablecen automáticamente cuando reiniciamos el diseño.

Para restablecerlos, debemos agregar una Acción a nuestro Evento de On Start of Layout que los restablezca manualmente.

Vaya al evento On Start of Layout y agregue esta acción al evento inicial antes de llamar a los bucles For:

Su evento ahora debería verse así:

Match-3 Construct 2 tutorial

Si vuelve a probar, ya no debería tener este problema.


¿Que deberías hacer después?

En este punto, hemos pasado por todas las características que quería cubrir en el ámbito de estos tutoriales.

Te darás cuenta de que tu juego todavía no es exactamente el mismo que el de la demostración anterior, con la mayor diferencia de que tu juego no tiene una pantalla de inicio. He elegido no ir más de la creación de la pantalla de inicio, ya que es casi exactamente lo mismo que la creación de la pantalla Game Over - Dejo esto como un ejercicio para usted.

En su lugar, voy a discutir algunas características que podría considerar añadir a su juego que podría hacerlo mejor o más interesante.


Bloques de especialidad

Lo primero que quiero discutir son los bloques de especialidad - bloques que dan las bonificaciones del jugador o realizan alguna función única.

La mayoría de los juegos del Match-3 incluyen bloques de la especialidad para ayudar a romper la acción y para hacer el juego más emocionante. Tal como está, el juego puede durar teóricamente para siempre, pero la jugabilidad nunca cambia. Introducir tipos de bloques especiales de vez en cuando puede ayudar a que el juego sea más interesante cuando ha estado pasando por un tiempo.

Para integrar un bloque de especialidad tendrá que cambiar la forma en que se generan los bloques, de modo que cada vez que se crea un bloque existe una posibilidad aleatoria de que se convierta en un bloque de especialidad. Hay un número de maneras de hacer esto, pero generalmente su mejor apenas generar un número al azar entre 1 y 100 y generar solamente un bloque de la especialidad cuando el valor al azar está entre 95 y 100, o algún otro rango que usted decide.

Su objetivo debe ser hacer que los bloques de especialidad sean raros, pero no demasiado raros. De esta manera, el jugador los conseguirá regularmente lo suficiente para hacer el juego más divertido, pero no tan a menudo que destruye el equilibrio del juego.

Bloques Bomba

Cuando se trata de bloques de especialidad que tiene un montón de opciones, Uno de los más comunes es un bloque bomba.

Los bloques de bomba hacen que bloques extra sean destruidos cuando son destruidos. 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 bloque de bombas del popular juego Candy Crush Saga:

Match-3 Construct 2 tutorial

Los bloques de bombas son generalmente bastante simples de integrar:

  • Comience con un Evento que escucha la destrucción de cualquier bloque bomba.
  • Cada vez que uno es destruido, debe pasar su posición en una función que luego encontrar y destruir todos los bloques que también sería destruido por ese bloque bomba.
  • Por ejemplo, si se supone que su bloque de bombas destruye todos los bloques circundantes, pasaría la posición del bloque de bombas a una función que vería cada una de las posiciones circundantes para ver si hay bloques allí.
  • Si encuentra bloques en estas posiciones, entonces los destruye.

Bloques de Tiempo-Lento o Tiempo-Parar

Otro tipo de bloque de especialidades que encontrará en muchos juegos es uno que ralentiza la rapidez con que se mueven los bloques o los detiene por completo.

Los bloques como éstos son muy simples de hacer.

  • Al igual que con los bloques de bombas, necesitará un evento que escuche cuando uno de estos bloques es destruido.
  • Siempre que esto suceda, debe cambiar MovementsPossible a 1 para que los bloques se detengan, o modificar la velocidad speed para que los bloques se muevan muy lentamente.
  • A continuación, debe iniciar un temporizador que dure por un corto período de tiempo, tal vez 10 - 15 segundos. Una vez que termine el temporizador, restablecerá la velocidad de los bloques y procederá normalmente.

Debe recordar que el jugador debe activar un bloque de bloqueo de tiempo mientras otro bloque de parada temporal ya está activo. En este escenario, debe reiniciar el temporizador o agregar la longitud estándar del temporizador al temporizador existente y continuar normalmente.


Otros modos de juego

También podría considerar añadir otros modos de juego para cuando el jugador se aburre del modo sin fin que creamos.

Modo temporizado

El modo de juego más fácil de agregar es aquel en el que el jugador tiene un límite de tiempo, con su objetivo es conseguir tantos puntos como puedan antes de que acabe el tiempo.

En este escenario, dejaría todo el código del juego intacto, excepto para añadir una segunda condición de pérdida al juego, con lo cual el juego finaliza cuando el temporizador se agota (así como cuando los bloques tocan la parte superior de la pantalla).

Cuando el juego comienza, usted comenzaría un contador de tiempo para la cantidad de tiempo que dura el modo, y cuando el contador de tiempo termina usted terminaría el juego la misma manera que ahora.

Modo Rompecabezas

En este modo de juego le daría al jugador un tablero de juego muy específico que diseñar de antemano y pedirles que eliminen todos los bloques en tan pocos intercambios como sea posible.

(Probablemente quiera desactivar el movimiento del bloque, ya que si los bloques se están moviendo también habrá nuevos bloques agregados con el tiempo).

Este modo requeriría que usted fuera capaz de configurar una cuadrícula de bloques específica, por lo que tendría que tener un sistema que le permite pasar en una configuración de bloque específico cuando el juego comienza en lugar de generar uno enteramente al azar como lo hacemos ahora.

Además de esto, mientras que este modo de juego sería relativamente fácil de implementar, se requiere que usted haga un montón de diseño de rompecabezas manual para que usted podría crear una gran cantidad de rompecabezas únicos para el jugador a tratar de resolver.

Añadir un modo de juego como este puede ser bastante lento debido a toda la creación de contenido necesario, pero hay un montón de jugadores que lo disfrutaría. Realmente puede pagar bien si se pone en el tiempo.


Conclusion

En el transcurso de esta serie de tutoriales, construimos un partido completo de match-3 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 un montón de maneras en que puedes usar las ideas que he presentado para ayudarte con otros proyectos de juego.

Sigue trabajando en tu juego y sigue explorando nuevas ideas, porque nunca sabes cuándo algo que aprendiste aquí podría ser útil después.

Espero que, si usted pasó por toda la serie o simplemente saltó a las partes que no fueron capaces de hacer por su cuenta, aprendió algo de esto. Si tiene algún problema o comentario, háganoslo saber en las discusiones siguientes 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!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.