Die Spielschleife verstehen - Basix

Nahezu jedes Spiel kann als eine Hauptfunktion betrachtet werden, die die gesamte Spiellogik enthält und entweder ausgeführt wird, wenn der Benutzer etwas tut oder nach einer bestimmten Zeit. Dieser Zyklus, bei dem die gleiche Kernfunktion immer wieder ausgeführt wird, heißt Spielschleife, und ist für jede Art der Spieleentwicklung von grundlegender Bedeutung.

Sie haben wahrscheinlich das Brettspiel Chutes and Ladders (oder Snakes and Ladders, wie wir es in Großbritannien nennen) gespielt..

(Fotokredit incurable_hippie auf Flickr)

Jeder Spieler würfelt (oder dreht den Spinner) und bewegt sich um die angegebene Anzahl von Feldern vorwärts. Das Feld, auf dem sie landen, kann sie dazu bringen, nach hinten zu rutschen oder einige Felder nach vorne zu klettern. Der Spieler gewinnt das Spiel, wenn er das letzte Feld erreicht.

Wenn Sie auf dem obigen Bild 6 landen, klettern Sie vier Felder bis zum Platz 10; Wenn Sie auf Platz 19 landen, rutschen Sie 15 Felder auf Platz 4 zurück. Wenn Sie auf Platz 64 landen, gewinnen Sie das Spiel.

Angenommen, Sie spielen Einzelspieler, um zu üben. Sie tun immer wieder dasselbe wie oben, bis Sie Platz 64 erreichen. Wie würden Sie dies im Code darstellen??

Sie würden wahrscheinlich damit beginnen, ein Array zu erstellen, um die Werte der Quadrate zu speichern. Die meisten Elemente würden Null enthalten, aber einige würden entweder eine positive Zahl (die eine Kontaktliste angibt) oder eine negative Zahl enthalten:

Hinweis: Dies ist Pseudocode, nicht AS3

 var specialSquares: Array = []; specialSquares [0] = 0; // das Feld, auf dem die Spieler beginnen, bevor 1 specialSquares [1] = 0 ;? specialSquares [6] = +4 ;? specialSquares [19] = -15;

? und so weiter. Dann hätten Sie eine Funktion, um den Spieler anhand der Nummer auf dem Würfel zu bewegen:

 Funktion movePlayer (Quadrate: Anzahl) newSquare = currentSquare + Quadrate; newSquare + = specialSquares [newSquare]; currentSquare = newSquare; 

Sie könnten dies dann in eine größere Funktion einfügen, die eine ganze Runde darstellt:

 Funktion takeATurn () diceNumber = zufällig (1, 6); // Zufallszahl zwischen 1 und 6 movePlayer (diceNumber); if (currentSquare == 64) // Spieler hat gewonnen! Spiel ist aus  

Diese Funktion, eine Wendung machen(), kapselt die Kernspiellogik für Einzelspieler-Chutes und Ladders. Aber wie bekommen wir diese Funktion tatsächlich zum Laufen? Es gibt mehrere Möglichkeiten:


Führen Sie die Funktion basierend auf der Spielereingabe aus

Wir könnten einen Button auf dem Bildschirm platzieren und ihn anrufen lassen eine Wendung machen() Jedes Mal, wenn es angeklickt wird. Wenn Sie jemals Facebook Scrabble oder Words With Friends gespielt haben, haben Sie diese Option in Aktion gesehen.


Führen Sie die Funktion basierend auf der verstrichenen Zeit aus

Wir könnten machen eine Wendung machen() Laufen Sie alle 60 Sekunden.

Eigentlich ist diese Option etwas komplizierter, als es den Anschein hat. In der Praxis sehen wir niemals Spiele ohne etwas Spielereingabe; Ohne Interaktion kann es nicht wirklich als Spiel betrachtet werden. Dennoch haben einige Spiele ein Element der "Kalenderzeit". Betrachten Sie FarmVille: Sie, der Spieler, pflanzen Ihre Ernte, und dann entwickeln sie sich alle paar Minuten (oder Stunden) etwas weiter, vom Samen über die Triebe bis zur Frucht. In einigen Zivilisationsmodi haben Sie eine bestimmte Zeit (beispielsweise fünf Minuten), um alle Ihre Züge für einen "Zug" zu machen. Sobald diese fünf Minuten abgelaufen sind, wird die Kernspiel-Logikfunktion ausgelöst.


Tue beides

Einige Spiele verwenden eine Mischung aus diesen beiden Optionen: Mafia Wars verfügt beispielsweise über eine Ressource, die "Energie" genannt wird, die alle fünf Minuten eine Einheit auffüllt. Wenn Sie diese Ressource verwenden, nehmen Sie Aktionen im Spiel vor, sodass die Kernfunktion der Spielelogik immer noch durch eine Benutzeraktion ausgelöst wird. Sie ist nur durch die Zeit eingeschränkt.

Dies ist ein Muster, das bei den meisten Spielen üblich ist: Ein Code, der die Kernelogik enthält, wird wiederholt ausgelöst. Wir nennen das die Spielschleife.

Es gibt einen Begriff für die Aktion oder den Zeitraum, der auch den Logikcode der Kernspiele auslöst: a Tick (wie der Klang, den eine Uhr macht).

In Civilization erfolgt also alle fünf Minuten ein Tick. In Words With Friends spielen Sie an der Reihe verursacht ein Häkchen. Mit anderen Worten, die Spielschleife wird einmal pro Tick ausgeführt.


Was ist mit Mario??

Super Mario Bros scheint in keine dieser Kategorien zu passen. Mario antwortet auf die Eingabe des Spielers? und dennoch laufen alle möglichen Dinge ab, ohne dass Sie etwas tun müssen (Goombas läuft herum, der Timer zählt herunter, Objekte fallen herunter). Gibt es zwei Spielschleifen?

Es gibt nur eine, und sie wird nur durch die Zeit ausgelöst - allerdings mit einem Tick von einem Bruchteil einer Sekunde.

In Civilization haben Sie fünf Minuten Zeit, um alles einzugeben, was Sie in der aktuellen Runde tun möchten, bevor das Spiel "tickt" und die Spielschleife erneut startet, basierend auf all Ihren Eingaben. Wenn Sie also in Runde 23 sagen, dass Sie möchten, dass Ihre Krieger einen Hirsch angreifen, dann bekommen in Runde 24 alle Wildgerichte zum Abendessen.

Mit Mario ist es genauso. Wenn Sie die Jump-Taste während eines Ticks drücken, springt Mario in der nächsten Wiederholung der Spielschleife.

Beachten Sie, dass Sie nicht Sie müssen Ihr Jump drücken, um zu erscheinen, sobald die Kernspiel-Logikfunktion ausgelöst wird. Alle Ihre Aktionen während einer Tick-Periode werden aufgezeichnet und während der nächsten Iteration der Spielschleife verwendet.


Ist Alles Gesteuert durch die Spielschleife?

Die gesamte Spielelogik wird in der Spielschleife behandelt. Aber ein Spiel hat mehr zu bieten als seine Logik. Grafik ist das Hauptbeispiel.

Das Zeichnen von Grafiken auf dem Bildschirm ist für den Computer harte Arbeit. Nehmen wir an, Sie haben ein Action-Spiel mit einem Tick von 1/60 Sekunde. Dadurch sollte das Spiel das Gefühl haben, auf die Steuerung des Spielers flüssig zu reagieren. Was passiert jedoch, wenn der Computer des Spielers zu langsam ist, um den gesamten Code für die Spiellogik auszuführen (auf Eingaben reagieren, die Schwerkraft simulieren, AI-Routinen ausführen) und Zeichne alles innerhalb von 1 / 60stel Sekunde auf den Bildschirm?

In diesem Szenario können wir zwei separate Schleifen verwenden: eine Spielschleife und eine Schleife zeichnen. Wir könnten dann die Draw-Schleife mit einer viel niedrigeren Frequenz als die Game-Schleife ausführen. Angenommen, wir aktualisieren den Bildschirm nur halb so oft, d. h. jede halbe Sekunde.

Die für das Spiel erforderliche Verarbeitungsleistung kann von Level zu Level variieren. Man denke an ein Shoot-Em-Up: In den ersten paar Levels werden nur wenige Schiffe auf dem Bildschirm angezeigt, um den Spieler behutsam zu erleichtern, während in den letzten Levels Dutzende feindlicher Schiffe und hunderte von Kugeln die gleiche Szene umfliegen könnten Einmal. Die Spielschleife muss herausfinden, wie sich all diese Objekte bewegen sollen, und die Zugschleife muss jedes wiedergeben, sodass es möglich war, sowohl die Spielschleife als auch die Zugschleife jede 1/60 Sekunde einer Sekunde auszuführen Spielbeginn, am Ende muss etwas geben.

Es ist im Allgemeinen einfacher, die Draw-Schleife zu verlangsamen als die Game-Loop, wenn Sie wählen müssen. Wenn Sie die Tick-Länge der Spielschleife anpassen, müssen Sie alles in Ihrem Spiel anpassen, das auf der Zeit basiert. Wenn Mario mit einer Geschwindigkeit von 20 Pixeln / Sekunde läuft und Sie das Spiel mit einer Tick-Länge von 1/60 einer Sekunde entwerfen, müssen Sie ihn um 1/3 eines Pixels pro Tick verschieben. Wenn Sie die Spielschleife so einstellen, dass sie eine Tick-Länge von 1/30 einer Sekunde hat, müssen Sie diese auf 2/3 Pixel pro Tick einstellen - und das ist sogar eine einfache Änderung im Vergleich zu physikalischen Berechnungen und KI-Routinen konsistent.

Aus diesem Grund zielen Spiele häufig darauf ab, den Tick der Spielschleife konstant zu halten, und verlangsamt die Ziehschleife, wenn mehr Leistung benötigt wird. Wenn Sie den FPS-Zähler (kurz für "Frames Per Second", wie oft die Zugschleife pro Sekunde ausgeführt wird) in einem Ego-Shooter aktiviert haben, haben Sie festgestellt, dass sich der FPS-Zähler ändert, je nachdem, wie viel auf dem Bildschirm angezeigt wird ; Die Aktualisierungsrate der Zeichnungsschleife wird automatisch angepasst. Das Spiel mag rudelig aussehen - wie ein Live-Streaming-Video mit langsamer Internetverbindung - aber wenn es nicht auf einem Computer läuft, der viel weniger Leistung hat, als die Spieleentwickler im Sinn hatten, werden alle Objekte in der Spielwelt weiterhin funktionieren bewegen und interagieren Sie mit den richtigen Geschwindigkeiten.

Einen großartigen Artikel, der erklärt, wie Flash damit umgeht, findest du in dem Beitrag von Sean Christmann auf der "Elastic Racetrack"..