Faire un match-3 dans Construct 2 Chaining and Game Overs

Le moment est enfin venu: nous avons presque terminé notre jeu et sommes prêts à mettre en œuvre le mécanisme de jeu final. Cet article se concentrera sur la création d’un système de combo offrant au joueur plus de points pour la création de chaînes détruisant plusieurs groupes de blocs après un seul échange..

En plus de cela, nous allons implémenter le scénario de perte et ajouter un écran Game Over. Enfin, je parlerai de choses sur lesquelles vous pouvez travailler à votre rythme pour améliorer et développer le jeu au-delà de ce que nous avons couvert. Alors, sans plus tarder, commençons…


Démo finale du jeu

Voici une démo du jeu sur lequel nous travaillons et que nous aurons construite à la fin de cette partie de la série:




Trouver des matchs

Avant de passer à l’article principal, je souhaite apporter un petit changement en indiquant quand FindMatches se fait appeler.

En travaillant sur cet article, j'ai découvert un problème que vous pouvez voir dans le GIF ci-dessous:

Comme vous pouvez le voir dans ce premier GIF, lorsqu'un bloc est lâché sur une distance d'un bloc pour tenter de correspondre à un groupe de blocs au bas de la chute, cela fonctionne parfaitement..

Dans ce second fichier GIF, cependant, il devient clair que lorsqu'un bloc est largué sur une distance plus grande dans le même scénario, il ne détecte pas la correspondance tant que nous n'effectuons pas un autre échange. La raison en est que le jeu ne recherche pas assez souvent les matchs..

À l’heure actuelle, le jeu ne recherche que les matchs après un échange, mais en raison du temps qu’il faut à un bloc pour réduire cette distance, la détection du match est déjà terminée lorsque le bloc touche le sol. il est relancé.

Pour résoudre ce problème, nous allons modifier lorsque nous effectuons une FindMatches vérifier.

D'abord aller au SwapBlocks fonction et supprime l'événement final de la fonction pour qu'elle n'appelle pas FindMatches du tout.

SwapBlocks devrait ressembler à ceci maintenant:

À ce stade, il n'y a pas d'événement appelant FindMatches. Nous allons résoudre ce problème en ajoutant une nouvelle action à l'événement qui détecte quand les correspondances sont possibles. Recherchez cet événement et ajoutez cette action à la fin de l'événement Else:

Action: Fonction> Fonction d'appel Name = "FindMatches"

Votre événement devrait maintenant ressembler à ceci:

De plus, saisissez cette occasion pour déplacer les deux MatchsPossible Événements jusqu'à la fin du code du jeu, si ce n'est déjà fait. Cela garantira qu’ils ne seront pas appelés avant le code, ce qui éliminera les correspondances prédéfinies..

Si vous lancez le jeu maintenant, vous devriez pouvoir exécuter le scénario que j'ai présenté ci-dessus sans problème..


Chaînage

Avec ce problème résolu, nous allons mettre en œuvre la chaînage système, qui donne au joueur des points supplémentaires pour les matchs causés par la destruction d'un autre match.

Vous pouvez voir un exemple du type de situation que je veux dire ci-dessous:

Dans le scénario ci-dessus, le joueur déplace le bloc vert et crée une correspondance. Ensuite, la destruction des blocs verts provoque la chute des blocs bleus et crée un autre match quelques instants plus tard..

Je veux donner au joueur des points de bonus pour avoir réalisé quelque chose comme ça. Plus précisément, je veux appliquer un multiplicateur au nombre de points que le joueur reçoit pour chaque match et le faire augmenter à chaque match consécutif..

Le faire fonctionner

Pour que ce système fonctionne, nous allons créer une nouvelle variable appelée Chaîne, puis apportez quelques petites modifications aux fonctions existantes. Donc, commencez par créer une nouvelle variable globale:

Variable globale: Type de chaîne = Nombre Valeur initiale = 0

Votre variable devrait ressembler à ceci:

Cette variable agira comme un multiplicateur pour les points pour lui dire combien de temps une chaîne dure.

Maintenant, allez à l’événement qui provoque la chute des blocs et supprimez l’événement Else qui appelle le FindMatches une fonction.

Maintenant, allez à FindMatches lui-même et trouver les endroits où vous faites la FloatingPointsText objets. Modifiez les instructions Set Text afin qu’elles utilisent une nouvelle formule:

Action: FloatingPointsText> Définir le texte Text = NumMatchesFound * 10 * Chain

Ce changement rend le texte flottant modifié de la même manière que les points eux-mêmes finiront par.

Ensuite, allez à la section de FindMatches où vous appelez FindMatches à la fin de l’événement et supprimez cet appel de fonction et l’instruction Wait. Pourquoi? Parce que, si nous ne les supprimons pas, alors FindMatches finirait par être appelé trop de fois et les chaînes ne seraient jamais lancées correctement.

(En raison des modifications apportées plus haut dans cet article, FindMatches sera appelé chaque fois que tous les blocs sont dans la grille et qu'aucun ne tombe. Avoir plusieurs domaines où nous appelons FindMatches provoquerait l’exécution simultanée de plusieurs instances de la fonction et pourrait gâcher le système de points.)

Enfin, nous apporterons un autre changement à cette fonction. Accédez à la fin de la fonction et ajoutez cette action après avoir défini PointsGiven à 0:

Action: Système> Ajouter à la variable = "Chaîne" Valeur = 1

Maintenant, chaque fois que le jeu trouve des allumettes, il donne des points au joueur, détruit les blocs, et augmente ensuite la valeur de la chaîne.

La nouvelle version de FindMatches devrait ressembler à ceci:

Ensuite, allez au Give Points fonctionne et modifie les deux actions qui augmentent la valeur du score pour qu'elles tiennent compte de la valeur de la chaîne:

Action: Système> Ajouter à la variable = Valeur du score = 10 * Chaîne

Avec ce changement, Give Points devrait maintenant ressembler à ceci:

Réinitialisation de la chaîne

Nous avons implémenté la variable Chain en tant que multiplicateur pour les points que le joueur reçoit (et le nombre de points affichés dans les objets texte flottants), mais il reste une chose à faire: nous devons ajouter une déclaration qui réinitialise la valeur de la chaîne pour qu'elle n'augmente pas simplement à l'infini.

Nous allons ajouter cette déclaration au Sur DragDrop Start Événement de sorte que, chaque fois que le joueur commence à faire glisser un nouveau bloc, il est considéré comme une nouvelle chaîne. L’autre raison pour laquelle nous le faisons ici est qu’il empêche la réinitialisation prématurée de la valeur de la chaîne, ce qui rend tous les matchs de la dernière partie de la chaîne moins précieux..

Aller au Sur DragDrop Start Événement et ajoutez cette action à la liste des actions:

Action: Système> Valeur définie Variable = Valeur en chaîne = 1

Votre événement devrait maintenant ressembler à ceci:

Si vous testez le jeu à ce stade, vous devriez voir que si vous créez une chaîne similaire à celle que j’ai démontrée précédemment dans le gif, vous recevrez 90 points au lieu de 60..

Avec cela, le système de chaînage est complet et vous devriez pouvoir créer une chaîne aussi élaborée que vous le souhaitez sans problème..


Fixation en chute

La prochaine chose que je veux aborder est un problème que j'ai découvert avec le système de blocage en chute. Si vous passez beaucoup de temps à jouer à notre jeu de Match-3 dans son état actuel, vous avez peut-être remarqué un problème où, de temps en temps, un blocage ne tombe pas, même s'il n'y a pas de blocage en dessous..

Vous pouvez voir ce que je veux dire dans l'image ci-dessous:


Bien qu’il n’y ait pas de bloc sous le bloc jaune, il n’est toujours pas tombé dans l’espace vide. C'est un problème rare, mais s'il n'est pas réglé, cela peut tout de même gâcher le score de quelqu'un et l'empêcher de recevoir la chaîne qu'il a configurée, ou même lui faire perdre une fois que nous avons ajouté la fonctionnalité Game Over..

Le problème vient de la variable BlockBeingMoved, utilisé par l’événement pour déterminer quand les blocs doivent tomber pour s’assurer qu’aucun bloc n’est déplacé lorsqu’il indique à un bloc de remplir un espace vide. Dans certains scénarios, lorsque le joueur déplace un bloc, cette variable ne se réinitialise jamais et les blocs ne tombent pas tant qu'un autre bloc n'est pas déplacé et qu'il ne se réinitialise pas correctement. Pour résoudre ce problème, nous allons ajouter une paire d'événements qui définiront et réinitialiseront cette variable correctement, et nous supprimerons les actions en cours qui définissent la variable, car elles ne fonctionnent pas correctement..

D'abord, allez au OnDragDrop Start et Sur DragDrop Drop Événements, et supprimez toutes les actions qui traitent de la BlockBeingMoved variable de ces événements. Il doit y avoir une action dans chaque événement qui doit être supprimée.

Ensuite, allez à l'événement qui détecte quand il y a un espace vide sous un bloc. Nous allons modifier les conditions de cet événement. Assurez-vous d'abord que la condition qui vérifie si BlockBeingMoved est égal à 0 est au début. Ensuite, ajoutez une autre condition à la fin de l'événement pour vérifier qu'aucun bloc n'est déplacé..

C'est la condition que vous allez ajouter:

Condition: Inverser: Bloquer> Fait glisser

Votre événement devrait maintenant ressembler à ceci:


Enfin, nous allons ajouter deux autres événements à la fin de la Feuille d'événement qui va gérer le BlockBeingMoved variable. Allez au bout de votre Feuille d'événement et ajoutez ces événements:

Evénement: Condition: Bloquer> Fait glisser l'action: Système> Définir la variable Nom = BlockBeingMoved Valeur = 1
Evénement: Condition: Système> Autre Action: Système> Définir la variable Nom = BlockBeingMoved Valeur = 0

Vos nouveaux événements devraient ressembler à ceci:


Ces événements vont effectivement changer BlockBeingMoved de 0 à 1 et de 1 à 0 chaque fois qu'un bloc est déplacé, ou est ne pas être déplacé, respectivement. Si vous testez le jeu à ce stade, vous devriez pouvoir jouer autant de fois que vous le souhaitez sans rencontrer aucun problème avec Block tomber..


Jeu terminé

Maintenant que notre système de chaînage est en place, nous allons ajouter le scénario de perte et un écran Game Over..

La première chose à faire est d’ajouter une nouvelle disposition qui servira d’écran de game over:

  1. Sur le côté droit de l’écran, cliquez avec le bouton droit de la souris sur Layouts dossier et sélectionnez Ajouter une mise en page.
  2. Sélectionner Ajouter une feuille d'événement.
  3. Accédez à la nouvelle mise en page et créez un nouveau BG Tile objet.
    1. Choisissez l'image GameOverBGTile.png du Images BG dossier dans le pack graphique que vous avez téléchargé lors du premier tutoriel.
    2. Met le Position à -6, -7.
    3. Met le Taille à 613, 619.
  4. Créer un nouveau Lutin objet.
    1. Choisissez l'image GameOverText.png du pack graphique.
    2. Met le Position à 303, 200.
  5. Créer un nouveau Bouton objet.
    1. Met le prénom à Redémarrer le bouton.
    2. Met le Position à 262, 410.
    3. Met le Taille à 100, 30.
    4. Met le Texte à Redémarrer.

Maintenant que votre écran Game Over est configuré, retournez à votre mise en page d'origine., Disposition 1, et ajoutez un nouvel élément à cet écran:

  1. Sur la disposition 1, créez un nouveau Lutin objet.
  2. Utilisez le Seau de peinture outil pour peindre ce sprite entièrement rouge.
  3. Fermer l'éditeur d'animation.
  4. Met le prénom à GameOverArea.
  5. Met le Position à 196, -30.
  6. Met le Taille à 344, 150.
  7. Met le Opacité à 0.

Vous remarquerez que cette image-objet se trouve à la même position et à la même taille que la partie supérieure du champ de jeu. Nous allons utiliser cet objet sprite pour détecter quand le joueur a perdu en détectant quand un bloc entre en collision avec lui. Aller à Feuille d'événement 1 afin que nous puissions commencer à mettre en œuvre cette.

Arrêter les blocs au sommet

Avant de commencer à détecter le scénario de perte, nous devons ajouter une nouvelle variable que nous utiliserons pour arrêter les blocs lorsqu'ils se produisent. GameOverArea objet pour qu’ils ne bougent plus. Cela fera comprendre au joueur qu’il a perdu.

Variable globale: Type de mouvement possible = Nombre Valeur initiale = 0

Maintenant, allez à l'événement où vous déplacez les blocs et ajoutez cette condition:

Condition: Système> Variable de comparaison Variable = MovementPossible Comparaison = Égal à Valeur = 0

Votre événement de mouvement devrait maintenant ressembler à ceci:

Maintenant que le mouvement utilise notre nouvelle variable, nous allons ajouter l'événement qui détecte la condition de perte:

 Evénement: Condition: Bloquer> chevauche un autre objet. Object = GameOverArea Condition: Inverser: Bloquer> IsDragging. Action: Fonction> Appeler. Nom de la fonction = "Game Over".

L’événement que nous venons de faire appellera la fonction Game Over une fois qu’un bloc chevauche la GameOverArea. Maintenant, nous allons effectivement faire la Jeu terminé une fonction.

 Événement: Condition: Fonction> Fonction activée Nom = «Fin du jeu» Action: Bloquer> Définir activé État = Désactivé Action: Système> Définir la valeur Variable = MouvementPossible valeur = 1 Action: Système> Attendre secondes = 1.5 Action: Système> Aller à la présentation Layout = Layout 2

Vos deux nouveaux événements devraient ressembler à ceci:


La raison pour laquelle nous avons créé une fonction distincte au lieu de faire ces actions dans l'événement qui détecte réellement la fin du jeu, est que cet événement ne concerne que certains blocs en raison des événements qui le déclenchent. Comme vous pouvez le constater dans la fonction que nous avons créée, nous désactivons les fonctions de glissement du Bloc afin d’empêcher le joueur de continuer à faire des correspondances après la détection de la fin de la partie. Si nous le faisions dans le cas où le jeu serait détecté, les blocs bloquant le jeu ne seraient plus désactivés, et tous les autres blocs pourraient toujours être déplacés..

Maintenant, allez à Feuille d'événement 2; nous allons ajouter une fonctionnalité à la Redémarrer le bouton objet que nous avons fait plus tôt. Ajouter un nouvel événement à Feuille d'événement 2:

Evénement: Condition: RestartButton> Si vous avez cliqué sur Action: Système> Aller à la présentation Layout = Layout 1

Votre événement devrait ressembler à ceci:

Réinitialiser les valeurs

Si vous jouez au jeu maintenant, arrêtez une partie, puis redémarrez, vous remarquerez qu'elle revient à la mise en page d'origine, mais les blocs ne bougent pas. La raison en est que toutes les variables que nous avons utilisées sont des variables globales. Certaines d'entre elles ne sont donc pas réinitialisées automatiquement lorsque nous redémarrons la mise en page..

Pour les réinitialiser, nous devons ajouter une action à notre Au début de la mise en page Evénement qui les réinitialisera manuellement pour nous.

Aller au Au début de la mise en page Event et ajoutez cette action à l'événement initial avant l'appel des boucles For:

Action: Système> Réinitialiser les variables globales

Votre événement devrait maintenant ressembler à ceci:

Si vous testez à nouveau, vous ne devriez plus avoir ce problème.


Que devrais-tu faire ensuite?

À ce stade, nous avons passé en revue toutes les fonctionnalités que je voulais couvrir dans le cadre de ces tutoriels..

Vous remarquerez que votre jeu n'est toujours pas exactement identique à celui de la démo ci-dessus, la plus grande différence étant que votre jeu ne possède pas d'écran de démarrage. J'ai choisi de ne pas passer par la création de l'écran de démarrage, qui est presque identique à la création de l'écran Game Over. Je vous laisse cela comme un exercice..

Au lieu de cela, je vais discuter de quelques fonctionnalités que vous pourriez envisager d’ajouter à votre jeu et qui pourraient le rendre meilleur ou plus intéressant..


Blocs spécialisés

La première chose que je souhaite aborder concerne les blocs spécialisés, des blocs qui offrent des bonus au joueur ou remplissent une fonction unique..

La plupart des jeux de Match-3 incluent des blocs spécialisés pour aider à diviser l'action et rendre le jeu plus excitant. Dans l'état actuel des choses, le jeu peut théoriquement durer éternellement, mais le gameplay ne change jamais. L'introduction de types de blocs spéciaux de temps en temps peut contribuer à rendre le jeu plus intéressant lorsqu'il est utilisé depuis un certain temps..

Pour intégrer un bloc spécialisé, vous devez modifier la façon dont les blocs sont générés. Ainsi, chaque fois qu'un bloc est créé, il existe une chance aléatoire qu'il devienne un bloc spécialisé. Il existe plusieurs façons de procéder, mais il est généralement préférable de générer un nombre aléatoire compris entre 1 et 100 et de ne générer un bloc spécialisé que lorsque la valeur aléatoire est comprise entre 95 et 100, ou une autre plage que vous choisissez..

Votre objectif devrait être de faire des blocs de spécialité rares, mais pas aussi rare. De cette façon, le joueur les recevra assez régulièrement pour rendre le jeu plus amusant, mais pas si souvent que cela détruira l'équilibre du jeu..

Blocs de bombe

En matière de blocs spécialisés, vous avez beaucoup d'options. l'un des plus communs est un bloc de bombe.

Les blocs anti-bombes entraînent la destruction de blocs supplémentaires lorsqu'ils sont détruits. Ils sont différents dans chaque jeu: dans certains jeux, ils détruisent tous les blocs qui les entourent; dans d'autres, ils détruisent une ligne ou une colonne entière de Blocs.

Dans l'image ci-dessous, vous pouvez voir deux types de blocs de bombe du jeu populaire Candy crush saga:


Les blocs de bombe sont généralement assez simples à intégrer:

  • Commencez avec un événement à l'écoute de la destruction de blocs de bombes.
  • Chaque fois qu’on en détruit un, il doit passer sa position à une fonction qui trouvera et détruira tous les blocs qui seraient également détruits par ce bloc de bombe.
  • Par exemple, si votre bloc de bombe est censé détruire tous les blocs environnants, vous transmettez sa position à une fonction qui examine chacune des positions environnantes pour voir s’il ya des blocs..
  • S'il trouve des blocs dans ces positions, il les détruit.

Blocs temporels ou ralentis

Un autre type de bloc spécialisé que vous trouverez dans beaucoup de jeux est celui qui ralentit la vitesse de déplacement des blocs ou les arrête complètement..

Des blocs comme ceux-ci sont très simples à faire.

  • Comme avec les blocs de bombe, vous aurez besoin d'un événement à l'écoute de la destruction de l'un de ces blocs..
  • Chaque fois que cela se produit, vous devriez soit changer MouvementsPossible à 1 pour que les blocs s’arrêtent ou modifient le la vitesse de sorte que les blocs bougent très lentement.
  • Ensuite, vous devriez démarrer une minuterie qui dure une courte période, peut-être 10 à 15 secondes. Une fois que cette minuterie se termine, vous allez réinitialiser la vitesse des blocs et procéder normalement.

Vous devez vous rappeler de rendre compte du fait que le joueur a activé un bloc d'arrêt alors qu'un autre bloc est déjà actif. Dans ce scénario, vous devez redémarrer la minuterie ou ajouter la longueur standard de la minuterie à la minuterie existante et continuer normalement..


Autres modes de jeu

Vous pouvez également envisager d'ajouter d'autres modes de jeu lorsque le joueur s'ennuie du mode sans fin que nous avons créé..

Mode chronométré

Le mode de jeu le plus facile à ajouter est celui dans lequel le joueur a une limite de temps, son objectif étant d’obtenir le plus de points possible avant la fin du temps imparti..

Dans ce scénario, vous laisseriez tout le code du jeu tel quel, sauf pour ajouter une deuxième condition de perte au jeu. Le jeu se termine lorsque le temps imparti est écoulé (ainsi que lorsque les Blocs atteignent le haut de l'écran)..

Lorsque le jeu commence, vous commencez un chronomètre pour la durée du mode, et lorsque le chronomètre se termine, vous terminez le jeu de la même façon que vous le faites maintenant..

Mode Puzzle

Dans ce mode de jeu, vous fournissez au joueur un tableau de jeu très spécifique que vous concevez à l’avance et lui demandez d’éliminer tous les blocs en un minimum de permutations..

(Vous voudrez probablement désactiver le mouvement de bloc, car si les blocs bougent, de nouveaux blocs seront ajoutés au fil du temps.)

Ce mode nécessiterait que vous soyez capable de configurer une grille de blocs spécifique, de sorte que vous ayez besoin d'un système qui vous permet de passer dans une configuration de blocs spécifique au démarrage du jeu plutôt que d'en générer une entièrement au hasard, comme nous le faisons maintenant..

De plus, bien que ce mode de jeu soit relativement facile à mettre en œuvre, il vous faudrait beaucoup de conception de casse-tête manuelle pour pouvoir créer de nombreux casse-tête uniques que le joueur pourra résoudre..

Ajouter un mode de jeu comme celui-ci peut prendre beaucoup de temps en raison de la création de contenu nécessaire, mais de nombreux joueurs pourraient en profiter. Cela peut vraiment porter ses fruits si on y met du temps.


Conclusion

Au cours de cette série de didacticiels, nous avons construit un jeu de match-3 complet du début à la fin. Vous pouvez faire beaucoup plus avec ce jeu si vous prenez le temps et l'imagination, mais vous pouvez également utiliser les idées que j'ai présentées pour vous aider dans d'autres projets de jeu..

Continuez à travailler sur votre jeu et explorez de nouvelles idées, car vous ne savez jamais quand quelque chose que vous avez appris ici pourra vous être utile plus tard..

J'espère que, que vous ayez parcouru toute la série ou tout simplement sauté aux parties que vous n'aviez pas pu faire par vous-même, vous avez appris quelque chose de cela. Si vous avez des problèmes ou des commentaires, signalez-nous, lors des discussions ci-dessous, chaque article. J'aimerais beaucoup avoir de vos nouvelles et voir les modifications que vous allez ajouter. En tout cas, merci de lire et bonne chance avec vos jeux!