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

Hacer un juego Match-3 en Construct 2: Eliminar partidos pre-hechos

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: Block Movement
Make a Match-3 Game in Construct 2: Chaining and Game Overs

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

En el tutorial anterior finalmente conseguimos que nuestro juego se moviera y agregara movimiento a nuestros bloques. Además de eso, creamos un sistema de dificultad rudimentaria para hacer el juego más difícil a medida que el jugador juega más tiempo.

Con ambas características en el juego, estamos listos para implementar el sistema que eliminará los partidos pre-hechos del tablero. Aunque este no es el último artículo de la serie, este es el último sistema importante que necesitamos implementar, así que cómodos, porque tenemos nuestro trabajo cortado para nosotros.


Demostración final del juego

Aquí está una demostración del juego que estamos trabajando hacia a través de esta serie:




Arreglos rápidos

Antes de empezar con la parte principal de este tutorial, quiero tomar un minuto para corregir dos problemas que descubrí mientras escribía el tutorial anterior.

Partida

La primera cuestión que me estoy refiriendo surge en el escenario que puede ver a continuación:

IssueV1

En esta situación, si arrastras el Bloque B al punto verde, éste debería caer debido a los espacios vacíos debajo del punto y eventualmente aterrizará en el punto marcado como C. En la mayoría de los escenarios, esto sucederá y el juego funcionará normalmente, pero En algunos escenarios el juego detectará en cambio un partido en el breve momento en que el bloque B está al lado del grupo A y terminará destruyendo los tres bloques.

Este problema no es exclusivo de ese escenario anterior y también puede presentarse cuando se hace lo mismo en el escenario que he destacado a continuación.

IssueV2

Si no lo arreglamos, el jugador recibirá créditos y puntos por un número de partidos que nunca pensó hacer y también podría confundirse acerca de por qué tantos bloques están desapareciendo inesperadamente.

Afortunadamente, sin embargo, este es un problema simple de arreglar. Para solucionar este problema vamos a crear una nueva variable global llamada MatchesPossible que dictará si se pueden hacer coincidencias, y un nuevo Evento que detectará cuando un bloque está "cayendo" y modificará MatchesPossible para que no se puedan hacer coincidencias Ser hecho mientras esto sucede.

Primero crearemos la variable global:

Su nueva variable debe tener este aspecto:

Match3_Part7_MatchesPossible

Ahora haremos el Event que escuche cuando un bloque esté cayendo:

Este Event lo hace de modo que cuando un bloque se encuentra que tiene un espacio vacío debajo de él, MatchesPossible se establece en 1, lo que significa que no son posibles coincidencias. También notará que comprueba la posición Y del bloque. Esto es para asegurar que el bloque no está en la fila más baja de bloques que siempre tendrá espacio vacío debajo de él.

A continuación, necesitamos un Evento que establezca MKatchesPossible de nuevo a 0 cuando ningún bloque tiene un espacio vacío debajo de ellos. Este segundo Evento se va a basar en una condición Else:

Asegúrese de que este evento inmediatamente sigue al primer evento para que la instrucción Else se utiliza correctamente.

Sus dos nuevos eventos deben tener este aspecto:

Match3_Part7_MatchesPossibleEvent

Finalmente, vamos a agregar una nueva condición a CheckMatches para que vea MatchesPossible para determinar si se puede hacer una coincidencia. Agregue esta condición a la llamada de función inicial del evento CheckMatches.

Con la condición añadida, su evento CheckMatches debería tener el siguiente aspecto:

Match3_Part7_ModifiedCheckMatches

A diferencia de la mayoría de los problemas que hemos encontrado hasta este punto, este problema aparece en una base bastante inconsistente. Esto significa que no podemos probar realmente para ver si hemos solucionado el problema, sólo podemos probar para ver si hemos causado otros problemas. Si juega el juego ahora, debería ver que no se han producido nuevos problemas por esta condición.

Puntos

El segundo tema que quería corregir antes de agregar algo nuevo se relaciona con el sistema de Puntos.

Mientras trabajaba en el proyecto para este tutorial, noté que algo que hice causó que el sistema de Puntos se comportara extrañamente y le diera al jugador cuatro o cinco veces más puntos de los que debería estar recibiendo para cada partido. Aunque no pude determinar qué cambio he hecho causado esto para empezar a suceder, me encontré con que la raíz del problema era que la función de GivePoints era en realidad se llama varias veces ya que los bloques no fueron destruidos de inmediato. Afortunadamente, como nuestro último número, esto puede arreglarse fácilmente.

Para arreglar esto vamos a crear una nueva variable que le dirá al sistema si puede dar puntos. Entonces, cuando estemos a punto de usar la función de GivePoints también modificaremos la variable para asegurar que el Evento solo se dispare una vez. Finalmente, una vez que se hayan dado los puntos, cambiaremos la variable una vez más para que no haya problemas la próxima vez que intentemos dar puntos.

En primer lugar, crear una variable global denominada PointsGiven:

Su variable debe tener ser como esta:

Match3_Part7_PointsGiven

A continuación modificaremos la parte de la función FindMatches que realmente da los puntos añadiendo una nueva Condición y dos nuevas Acciones.

Ahora agregue esta Acción al principio de la lista Acción:

Finalmente, agregue esta Acción al final de la lista Acción:

El Evento ahora debe verse así:

Match3_Part7_ModifiedIsMatched

Con estos cambios lo hemos hecho para que el Evento que llama a GivePoints sólo se ejecute cuando la variable PointsGiven es 0. Dado que estamos poniendo el valor inmediatamente a 1 cuando iniciamos el Evento, esto evita que el Evento dispare más de una vez y asegura El jugador recibirá el número correcto de puntos.

Si ejecuta el juego en este punto, debe recibir el número correcto de puntos por cada partido que realice, incluso si no estuviera teniendo este problema para empezar.


Eliminación de partidos pre-hechos

Ahora que hemos conseguido esas correcciones fuera del camino, podemos pasar a crear el sistema que eliminará los fósforos que son generados por el sistema cuando está asignando al azar colores a los bloques que crea.

El problema que tenemos ahora es que, como los colores del bloque son completamente aleatorios, no es raro que empieces el juego y veas un montón de coincidencias que se hacen de inmediato. Este es un problema porque podría hacer los primeros segundos del juego muy confuso para alguien que nunca ha jugado antes, y porque está dando a los puntos del jugador que no ganó.

Para solucionar el problema, crearemos una función que examinará cada bloque y veremos si ese bloque es del mismo color que cualquiera de sus vecinos. Si es del mismo color que uno de sus vecinos, continuará cambiando el color de ese bloque hasta que ya no coincida con ninguno de los bloques que lo rodean.

Para que este sistema funcione, también tendremos que crear múltiples funciones de soporte y eventos, así como añadir una nueva variable de instancia al objeto Block.

Haciendo que funcione

Primero, cree una nueva variable de instancia para el objeto Block:

Esta variable es lo que usaremos para identificar fácilmente un bloque para poder decir algunas de las funciones que vamos a hacer exactamente qué bloque queremos mirar, independientemente de su posición.

Antes de seguir adelante, también necesitamos empezar a usar esta variable. Vaya al evento On start of layout que crea los bloques y añade una acción nueva antes de la acción que aumenta NumBlocks:

Su evento de creacion de bloques debería verse así:

Match3_Part7_ModifiedBlockSpawning

Luego necesitamos hacer una función que tome en la posición X e Y de un bloque y nos diga qué color es ese bloque:

La función debería verse así cuando haya terminado:

Match3_Part7_GetBlockColor

Ahora que tenemos una función que puede decirnos el color de cualquier bloque, vamos a crear la función que realmente mirará un bloque y determinará si tiene cualquier Bloques vecinos que son del mismo color.

La forma en que funcionará esta función es bastante simple.

  • En primer lugar, pasaremos un BlockID a la función.
  • Si actualmente hay un bloque con ese BlockID, la función buscará los cuatro bloques vecinos y determinará si el bloque que está mirando es del mismo color que cualquiera de sus vecinos.
  • Si encuentra que hay un vecino del mismo color, comenzará a cambiar el color del bloque que está viendo, y continuará cambiando el color hasta que el Bloque sea un color diferente de todos sus vecinos.

Antes de que podamos hacer este evento, tenemos que hacer una nueva variable global. En la función usaremos un bucle While para determinar si el color del bloque necesita ser cambiado. La variable que estamos a punto de crear es la variable que utilizará el bucle While para determinar si necesita continuar ejecutándose:

Sugerencia: El Evento que vamos a realizar contiene un Evento basado en Or. Si usted nunca ha hecho un bloque de eventos que tiene una o atributo único que tiene que hacer es hacer que el bloque de eventos como lo haría normalmente y luego haga clic derecho en todo el bloque y elija Crear 'o' Bloquear.Si usted nunca ha hecho un bloque de eventos que tiene una o atributo único que tiene que hacer es hacer que el bloque de eventos como lo haría normalmente y luego haga clic derecho en todo el bloque y elija Make 'Or' Block. A diferencia de un bloque de eventos estándar que requiere que todas las condiciones se llenen antes de que se dispare, un bloque o se disparará si se cumple alguna condición.

Entonces, hagamos el Evento:

Su evento debe tener este aspecto:

Match3_Part7_RemoveSpawnedMatches_Fixed

Entonces, ¿cómo funciona esta función exactamente?

Lo primero que hace es comprobar si hay un Bloque con el BlockID que el sistema pasó. Cuando localiza ese Bloque, establece el valor de HasMatchingNeighbors en 1 y luego ejecuta el bucle While.

Dado que el bucle While sólo se ejecutará cuando HasMatchingNeighbors sea 1, es decir, el valor al que lo establece. Durante el bucle While, prueba para ver si hay un Bloque vecino a la izquierda, a la derecha, arriba o abajo que es del mismo color que el Bloque que estamos viendo. Si encuentra un bloque correspondiente en cualquiera de estas posiciones, asigna al azar un nuevo color al bloque y luego ejecuta la prueba de nuevo asegurándose de que HasMatchingNeighbors esté establecido en 1. Cuando finalmente encuentre un color para el bloque que no coincida con ninguno De sus vecinos, cambia el valor de HasMatchingNeighbors a 0 para que termine el bucle while y el programa pueda funcionar.

Ahora necesitamos implementar esta función en el juego; Para ello vamos a tener que crear dos nuevas variables y dos nuevas funciones. Comencemos con las variables.

Sus variables deben verse así:

Match3_Part7_CheckMatchesVariables

Las dos variables que acabamos de hacer se utilizarán para activar los dos eventos que estamos a punto de crear. Los propios eventos se utilizarán para iterar a través de los bloques inmediatamente después de que se creen y enviar cada bloque a la función RemoveSpawnedMatches.

La razón por la que no estamos llamando a la función RemoveSpawnedMatches inmediatamente después de crear el bloque es porque la cuadrícula de bloque debe estar completa para que la función funcione correctamente. Por lo tanto, en lugar de simplemente llamar a la función directamente cuando se hacen bloques, en su lugar, desencadenar un evento que puede pasar por los bloques y llamar a la función por su cuenta después de la red se genera.

El primer Evento será específicamente para iterar a través del grupo inicial de bloques:

Éste es el aspecto que debe tener su evento:

Match3_Part7_CheckStartingMatches

El segundo Evento será específicamente para comprobar nuevas filas de bloques cuando se hacen:

Esto es lo que debería ser el segundo Evento:

Match3_Part7_CheckNewestRow

Implementación

Con estas dos funciones en funcionamiento, ahora solo necesitamos implementarlas. Vaya al evento inicial que hace los bloques, el evento On Start of Layout. Vamos a agregar un Sub-Evento a esto que le dirá al CheckStartingMatches Event que se active.

Su evento ahora debería verse así:

Match3_Part7_ModifiedStartofLayout

Este Sub-Evento escucha cuando el bucle For anidado ha terminado y luego cambia el valor de la variable CheckStartingMatches para activar el Evento apropiado.

Ahora vamos a hacer casi exactamente el mismo sub-evento y adjuntarlo a la función SpawnNewBlocks.

SpawnNewBlocks ahora debería verse así:

Match3_Part7_MdifiedSpawnNewBlocks

Este Sub-Evento hace lo mismo que el anterior, excepto que activa el otro Evento que creamos. Si ejecuta el juego en este punto, debería ver que al iniciar el juego ya no hay coincidencias que se produzcan automáticamente.


Conclusion

En este tutorial, no hicimos demasiados cambios en el juego, pero los que hicimos fueron muy importantes.

En este punto, creo que es mejor para nosotros parar por ahora y guardar los dos elementos finales del juego para el próximo tutorial, donde estaremos cubriendo las cadenas / combos y la pantalla Game Over. Esta será la parte final de la serie, por lo que también hablaré de algunos mecanismos de juego que no cubriremos en estos tutoriales y te daremos algunos consejos sobre cómo hacer esos sistemas por tu cuenta.

Si desea obtener una ventaja sobre el contenido de la próxima semana, empiece a ver cómo puede detectar cuándo debe aparecer la pantalla Game Over, en función de la posición o altura de algunos de los bloques. Como alternativa, comience a pensar en cómo podría detectar cuando el jugador hace una reacción en cadena que hace que se forme más de un grupo.

Hagas lo que hagas, espero verte de nuevo la próxima semana para la última entrega de la serie.

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.