Machen Sie ein Match-3-Spiel in Construct 2 Mehr Tauschen, Punkte und Matching

Wir sind jetzt zur Hälfte dieser Serie und bis jetzt haben wir viel darüber gesprochen. Im vorherigen Tutorial haben wir ein Punktesystem zu unserem Spiel hinzugefügt, schließlich haben wir die Schwerkraft auf die Blöcke angewendet und unser Matching-System verbessert. In diesem Tutorial werden wir ein paar kleine Verbesserungen an unserem Tauschsystem vornehmen, den Fließkomma-Text hinzufügen, den Sie in der endgültigen Version des Spiels sehen können, und unser Übereinstimmungssystem ein für alle Mal beenden.


Final Game Demo

Hier ist eine Demo des Spiels, an dem wir in dieser Serie arbeiten:




1. Verbesserung der Tauschmechanik

Im Moment hat das Spiel einen sehr einfachen Tauschmechanismus implementiert. Das System, das wir zur Durchführung dieser Swaps verwenden, ist zwar sehr effektiv, es gibt jedoch zwei Probleme, auf die Sie beim Spielen stoßen könnten, und beide sollten behoben werden, bevor wir fortfahren.

Diese Probleme beruhen auf der gleichen Idee: dass das Tauschsystem die Grenzen des Spielfeldes nicht berücksichtigt.

Links, rechts

Was bedeutet das genau? Wenn Sie möchten, können Sie einen Block außerhalb des Spielfelds nach links oder rechts verschieben, indem Sie einen Swap wie den unten abgebildeten ausführen:


Wenn Sie in das Spiel einsteigen und diesen Swap durchführen, werden Sie feststellen, dass das Spiel Sie nicht dazu bringt, Sie zu stoppen, und sich so verhält, als würde das Spielfeld für immer in horizontaler Richtung fortgesetzt. Der Grund dafür ist das Spielfeld tut für immer horizontal fortfahren.

Da wir nie definiert haben, wo sich die linken und rechten Grenzen des Spielfelds befinden oder sogar, dass das Spielfeld linke und rechte Grenzen hat, versucht das Spiel niemals, den Spieler daran zu hindern, den Block weiter zur Seite zu bewegen. Dieses Problem tritt auch auf, wenn Sie auch den anderen Rand des Spielfelds austauschen.

Um dieses Problem zu lösen, fügen wir einige neue Bedingungen hinzu Blockieren> Beim DragDrop-Drop Veranstaltung. Gehen Sie zu diesem Ereignis und fügen Sie diese Bedingung dem Unterereignis hinzu, das auf Links-Swaps prüft:

Bedingung: LeftBlock> X-Vergleich vergleichen = Größer oder gleich X = SPAWNX

Fügen Sie diese Bedingung nun dem Unterereignis hinzu, das nach richtigen Swaps sucht:

Bedingung: RightBlock> X-Vergleich vergleichen = Weniger oder gleich X = SPAWNX + Block.Width * 8

Ihre linken und rechten Tauschereignisse sollten jetzt so aussehen:


Diese neuen Bedingungen werden von den Tauschereignissen als Kontrolle verwendet, um sicherzustellen, dass der Tausch innerhalb der horizontalen Grenzen des Spielfelds liegt. Der erste stellt sicher, dass die Position, in die der Block getauscht werden würde, nicht weiter links als die am weitesten links liegenden Blöcke ist, und der zweite stellt sicher, dass die Position, in die der Block getauscht wird, nicht weiter rechts als der rechte ist. die meisten Blöcke.

Beim zweiten habe ich eine Formel mit verwendet Block.Width Um herauszufinden, wo sich die Blöcke ganz rechts befinden, um sicherzustellen, dass bei einer Änderung der Größe der Blöcke dieser Zustand nicht beeinträchtigt wird.

Wenn Sie das Spiel ausführen, sollten Sie keine horizontalen Swaps mehr ausführen können, die Blöcke außerhalb des Spielbereichs platzieren würden.

Außerhalb der Grenzen

Das andere Problem ist, dass das Spiel Sie nicht daran hindert, einen Block unter dem Spielfeld auszutauschen. Öffne das Spiel und versuche einen Swap zu machen, wie ich ihn in diesem Bild dargestellt habe:


Nachdem Sie diesen Tausch durchgeführt haben, sollten Sie gesehen haben, wie der Block im Wesentlichen nur hinter dem unteren Teil des Spielfelds verschwindet, und die darüber liegenden Blöcke sollten heruntergefallen sein, um den jetzt leeren Raum auszufüllen. Auch dieses Problem liegt daran, dass wir nie definiert haben, wo der untere Rand des Felds ist.

Im vorherigen Tutorial haben wir erklärt, dass die Blöcke nach Erreichen einer bestimmten Höhe nicht mehr fallen sollen, aber wir haben nie gesagt, ob es in Ordnung ist, dass ein Block diese Höhe unterschreitet, wenn ein Swap ausgeführt wird.

Die Behebung dieses Problems wird genauso einfach sein wie die vorherigen beiden Probleme. Gehen Sie zu dem Unterereignis, das nach Abwärts-Swaps sucht, und fügen Sie die folgende Bedingung hinzu:

Bedingung: BottomBlock> Y-Vergleich vergleichen = Weniger oder gleich Y = SPAWNY

Ihr Code für diesen Abschnitt sollte jetzt so aussehen:


Wie bei der vorherigen Bedingung wird dadurch sichergestellt, dass der Swap den Block nicht in einem Bereich außerhalb des Spielfelds platziert. In diesem Fall wird der Bereich unter dem Spielfeld betrachtet.

Wenn Sie Ihr Spiel zu diesem Zeitpunkt testen, sollten Sie jetzt keine Swaps mehr machen können, die den Block unter die Basis des Spielfelds stellen.

An diesem Punkt haben wir die Probleme mit dem Tauschsystem gelöst und können unser Punktesystem noch besser machen.


2. Fließkomma-Text

Im Moment ist unser Punktesystem ziemlich effektiv. Es funktioniert so, wie wir es uns vorgestellt haben und zeigt bereits alles richtig an. Wenn Sie das Spiel jedoch an einen Spieler weitergeben und sich mit ihm zusammensetzen, können diese möglicherweise nicht genau sagen, wie viele Punkte sie von jeder Gruppe erhalten haben, da das Spiel sich schnell bewegen kann.

Um dieses Problem zu lösen, fügen wir Text-Popups hinzu, in denen angezeigt wird, wie viele Punkte der Spieler aus den Gruppen bildet, die er bildet. Dies fügt dem Spiel ein zusätzliches visuelles Flair hinzu und zeigt dem Spieler, wie wertvoll größere Gruppen sein können.

Den Text selbst erstellen

Bevor Sie mit dem Hinzufügen der Funktionalität beginnen können, müssen Sie ein neues Objekt erstellen, das als Text-Popup fungiert. Befolgen Sie diese Schritte.

  1. Gehe zu Layout 1.
  2. Ein neues einfügen Text Objekt:
    1. Name: FloatingPointsText
    2. Schicht: Spielfeld
    3. Position: 616, 250
    4. Größe: 127, 43
    5. Text: 0
    6. Schriftart: Calibri, Fett, 24
    7. Farbe: 255, 255, 255
  3. In dem Projekte Klicken Sie mit der rechten Maustaste auf die Registerkarte FloatingPointsText Objekt und wählen Sie Verhaltensweisen.
  4. Neues hinzufügen Verblassen Verhalten, und schließen Sie die Verhaltensweisen Fenster.
  5. Ändern Sie in den Eigenschaften auf der linken Seite des Bildschirms das Ausblendzeit zu 1,25.

Das soeben erstellte Objekt wird verwendet, um den Floating-Text zu erstellen, der dem Spieler mitteilt, wie viele Punkte eine bestimmte Gruppe ihnen geben wird. Nun, da wir dieses Objekt tatsächlich haben, müssen wir es implementieren, damit der Spieler, wenn er eine Übereinstimmung vornimmt, eine neue Instanz des Objekts erzeugt und den Text so ändert, dass die entsprechende Anzahl von Punkten angezeigt wird.

Den Text laichen

Um den Punktetext zu erzeugen, fügen wir zwei neue Aktionen hinzu NumMatchesFound prüft im FindMatches Funktion.

Gehe zum FindMatches Funktion und fügen Sie diese beiden Aktionen am Ende jeder hinzu NumMatchesFound> 3 prüfen:

Aktion: System> Objekt erstellen Objekt = FloatingPointsText Layer = 2 X = Block.X - Block.Width / 2 Y = Block.Y - Block.Width / 2 Aktion: FloatingPointsText> Set Text Text = NumMatchesFound * 10

Ihre FindMatches Funktion sollte jetzt so aussehen:


Also, was machen diese Aktionen? Die erste Aktion erstellt die FloatingPointsText Objekt oben auf dem ersten Block in der Gruppe, und der zweite multipliziert die Anzahl der Blöcke in der Gruppe mit 10, genau wie bei unserer Punktformel, und setzt den Text des neuen Objekts auf diese Zahl.


Wenn Sie das Spiel zu diesem Zeitpunkt ausführen, sollten Sie feststellen, dass sich der Text überhaupt nicht bewegt. Um dieses Problem zu beheben, fügen wir unserem Spiel ein neues Ereignis hinzu.

Den Text verschieben

Geh zurück zu Veranstaltungsblatt 1 und füge ein neues Event hinzu:

Bedingung: System> Every Tick Action: FloatingPointsText> Bewegen im Winkel Winkel = -90 Abstand = 0,25

Ihre neue Veranstaltung sollte so aussehen:


Wenn Sie das Spiel jetzt ausführen, werden Sie feststellen, dass sich der Text bewegt.

An diesem Punkt ist unser FloatingPointsText funktioniert so, wie wir es wollen, aber Sie haben vielleicht ein kleines Problem festgestellt, seit das System installiert ist. Das Problem selbst ist auf die Funktionsweise des Abgleichsystems zurückzuführen. Da wir nun feststellen können, dass es immer noch ein Problem mit dem Abgleichen gibt, können wir dieses letzte Problem beheben und unser Abgleichsystem ins Bett bringen.


3. Vervollständigung des Matching-Systems

Wenn Sie noch nicht wissen, von welchem ​​Thema ich spreche, gehen Sie in das Spiel und bilden Sie eine Gruppe mit vier Blöcken. Sobald Ihre Gruppe erstellt ist, sollten Sie etwas ähnliches sehen, das ich im Bild unten habe:


Wie Sie sehen können, haben wir das tatsächlich zwei Instanzen der Floating-Text-Objekte. Wenn Sie eine Gruppe mit fünf Blöcken erstellen, wird das Problem noch schlimmer und Sie sehen tatsächlich drei Instanzen des Punktetextes.


Der Grund für dieses Problem liegt in der Art und Weise, wie Übereinstimmungen erkannt werden. Momentan betrachtet unser Matching-System jeden Block einzeln und in die richtige Richtung und nach unten, um Übereinstimmungen zu finden. Aus diesem Grund findet das Matching-System hier tatsächlich drei unterschiedlich große Gruppen, obwohl es sich eigentlich nur um eine große Gruppe handelt.

Die erste Gruppe wird gefunden, wenn sie mit Block A beginnt, und enthält fünf Blöcke:


Die zweite Gruppe wird gefunden, wenn sie mit Block B beginnt, und enthält vier Blöcke:


Die dritte Gruppe wird gefunden, wenn sie mit Block C beginnt, und enthält drei Blöcke:


Im Moment ist unser Matching-System sehr ineffizient - und defekt -, da es die gleichen Blöcke mehrmals überprüft und mehr Gruppen registriert, als tatsächlich vorhanden sind.

Wie wir das beheben

Das Problem zu beheben ist eigentlich viel einfacher, als es auf den ersten Blick erscheinen mag.

Das Problem hierbei ist in erster Linie darauf zurückzuführen, dass das Abgleichsystem nicht wissen kann, ob der Block, mit dem er beginnt, tatsächlich der Beginn der Gruppe ist. Wenn wir garantieren könnten, dass wir nur Blöcke betrachten, die am weitesten rechts oder in der höchsten Gruppe innerhalb der Gruppen waren, zu denen sie gehörten, dann wäre das Matching-System so, wie es ist.

Wir müssen also lediglich eine Bedingung oder ein Ereignis hinzufügen, die sicherstellen, dass oben oder links neben dem Block, mit dem wir beginnen, keine übereinstimmenden Blöcke vorhanden sind, und der Funktion mitzuteilen, wann diese Überprüfung durchgeführt wurde, damit dies möglich ist Fahren Sie normal fort, wenn der Block, den Sie betrachten, der Beginn der Gruppe ist.

Das erste, was wir hinzufügen werden, ist ein neuer Parameter für CheckMatches Funktion. Dieser Parameter wird eine ganze Zahl sein und entweder 1 oder 0.

Wenn der Parameter ist 1, es zeigt der Funktion an, dass es die Überprüfung durchführen muss, um sicherzustellen, dass der anfängliche Block in der Gruppe betrachtet wird; wenn es so ist 0, es zeigt der Funktion an, die es hat bereits Diese Prüfung wurde durchgeführt und kann normal fortfahren, um festzustellen, ob die Gruppe aus drei oder mehr Blöcken besteht.

Machen wir das

Beginnen Sie also mit dem FindMatches Funktion. In dieser Funktion rufen Sie an CheckMatches zweimal. Da ist es das erste Mal, dass Sie anrufen CheckMatches Für jeden Block, den Sie betrachten, müssen Sie jedem dieser Funktionsaufrufe einen neuen Parameter hinzufügen und ihn auf setzen 1 So wird geprüft, ob der Block, den Sie betrachten, der Beginn einer Gruppe ist.

Ihre FindMatches Die Funktion sollte jetzt so aussehen und ich habe die beiden geänderten Anweisungen für Ihre Bequemlichkeit hervorgehoben:


Jetzt erzählen wir es CheckMatches Wenn diese neue Prüfung durchgeführt werden muss, müssen wir die neue Prüfung hinzufügen, damit sie ausgeführt werden kann. Gehen Sie zu Ihrem CheckMatches Funktion und fügen Sie dieses neue Unterereignis als erstes Unterereignis hinzu:

Ereignis: Block> X Comaprison vergleichen = Gleich X = Function.Param (0) - ((Block.Width + 2) * Function.Param (3)) Bedingung: Block> Compare Y Comaprison = Gleich Y = Function.Param (1) - ((Block.Width + 2) * Function.Param (4)) Bedingung: Funktion> Vergleichsparameter Index = 5 Vergleich = Gleichwertig = 1

Bevor Sie mit dem Ändern fertig sind CheckMatches Funktion müssen Sie außerdem eine Else-Anweisung oben auf dem ursprünglichen Ereignis für die hinzufügen CheckMatches Funktion und Sie müssen den neuen Parameter zum hinzufügen CheckMatches Funktionsaufruf und setzen Sie es auf 0.

Der neue Code für die CheckMatches-Funktion sollte folgendermaßen aussehen:


Das Ereignis, das wir hinzugefügt haben, entspricht genau dem, was ich oben beschrieben habe. Zunächst wird der Block oberhalb oder links von dem ursprünglichen Block, den Sie übergeben, angezeigt.

Wenn dieser Block dieselbe Farbe wie der von Ihnen übergebene hat, tut er nichts, da er weiß, dass der von Ihnen übergebene Block nicht der erste Block in dieser Gruppe ist.

Andererseits, wenn es so ist nicht In der gleichen Farbe wie der Block, den Sie übergeben haben, erfolgt die ursprüngliche Prüfung aufgrund der soeben hinzugefügten Else-Anweisung und sie sucht nach einer Gruppe von drei oder mehr Blöcken, wie es normalerweise der Fall wäre.

Wenn Sie das Spiel zu diesem Zeitpunkt testen und eine Gruppe mit mehr als drei Blöcken erstellen, sollte nur ein schwebendes Textobjekt angezeigt werden, das angibt, wie viele Punkte diese Gruppe wert war.


Fazit

Nachdem wir alle diese Funktionen fertiggestellt und unser Matching-System abgeschlossen haben, können wir das Bewegungssystem implementieren. Da wir in diesem Tutorial bereits viel unternommen haben und da das Bewegungssystem mehrere komplexe Systeme herstellen muss, warte ich bis zum nächsten Artikel, um das Bewegungssystem zu starten.

Wenn Sie daran interessiert sind, daran zu arbeiten, ziehen Sie einige dieser Dinge in Betracht. Offensichtlich müssen Sie als erstes die Bewegung selbst implementieren. Versuchen Sie dazu, ein ähnliches System zu verwenden, das wir beim Erstellen der Punkte-Textobjekte verwendet haben. Beginnen Sie dann mit der Überlegung, wie Sie die Geschwindigkeit ändern würden, mit der sie sich bewegen. Wie werden Sie schließlich neue Reihen von Blöcken für den Player erstellen und wie werden Sie davon erfahren wann neue Zeilen erzeugen?

Nehmen Sie sich etwas Zeit, um über diese Dinge nachzudenken, und ich sehe Sie nächste Woche wieder für die nächste große Folge der Serie.