• 4Minuten
blank

In diesem Tutorial machen wir ein kleines Spiel. Dabei geht es nicht um das Gamedesign, sondern mehr um die Technik. Wir entwickeln ein kleines Spiel, welches lediglich aus einem Objekt besteht. In der Windows-Version nutzen wir keine Skripte, einen Raum und nur wenige Grafiken. Diese wurden übrigens von Harald in Photoshop erstellt.

Wer gleich einen Blick darauf werfen will, kann es im Browser spielen. Das komplette Beispiel könnt ihr hier herunterladen. Der Code ist kommentiert, hier im Artikel werden aber die wichtigsten Stellen ausführlicher erklärt.

Das Spielprinzip

Ich wollte es einfach halten. Man ist in einem Casino und hat zwei Würfel. Es wird Geld gesetzt, der Spieler würfelt, die Bank würfelt und wer gewinnt, behält das Geld. Das geht so lange, bis man pleite ist. D. h. wir arbeiten mit Zufallszahlen und ein paar wenigen Variablen. Eine Besonderheit besteht darin, dass die Würfel nacheinander angezeigt werden. Das lösen wir über Alarme. Das Prinzip kennen manche vielleicht schon aus dem Memory-Tutorial.

Bei einem Unentschieden bleibt das Geld im Pott. Man kann es beim nächsten Wurf verlieren oder gewinnen.

Einziges Problem: Wenn man kein Geld mehr hat, aber es ist aufgrund eines Unentschiedens noch Geld im Pott, hat man es verloren. Aber die Regeln könnt ihr natürlich selbst bestimmen, wie ihr wollt.

Vorbereitung

Unseren Raum passen wir auf die richtige Auflösung, 1024×576 an. Ich habe diese Auflösung gewählt, um ein 16:9 Seitenverhältnis zu haben. Für das Beispiel wollte ich aber keine 1080p verwenden.

Grafiken

Als Sprites nehmen wir zwei Würfel, einen Hintergrund und ein Logo. Das Logo kann man, theoretisch, auch als Text erzeugen.

  • bg_table ist unser Hintergrund
  • spr_dice1 ist der Würfel des Spielers
  • spr_dice2 ist der Würfel der Bank
  • spr_logo ist unser Schriftzug

Das Hintergrundbild stellen wir im Raum ein.

Der Würfel ist einfach gehalten. Kann man auch direkt im GM erzeugen. Ich habe ihn mit Affinity Photo gemacht.

blank

Der Würfel der Bank ist identisch, aber invertiert. Je nach Tisch und Farbverteilung bieten sich aber auch zwei bunte Würfel an.

Schrift

Ich verwende lediglich eine Schriftart, die ich fnt_cassino nenne. Für das Beispiel habe ich einen pixeligen Retro-Font genommen. Ihr seid natürlich frei, dies bei euch zu ändern.

Das eine Objekt

Zunächst stellt man sich die Frage, warum man überhaupt ein Spiel mit nur einem Objekt machen sollte. Ist es nicht besser, die Dinge ordentlich auszulagern? Mehrere Skripte, die ausgelagert mehr Übersicht bieten?

Im Prinzip ja. Und was ich gleich zeige, ist auch kein besonders guter Stil. Es soll aber einerseits die Möglichkeiten im GameMaker, aber auch gewisse Techniken der Programmierung zeigen. Gerade bei großen Projekten ist es irgendwann nicht mehr gut, wenn man zu viele Objekte und Skripte hat. Dann springt man von einem Fenster zum nächsten und hat Probleme, den eigenen Code zu verstehen. Und ja, manchmal macht es auch Spaß, einfach Code herunter zu tippen, wenn er am Ende funktioniert.

Im Beispiel habe ich das Objekt treffenderweise obj_casino genannt. Es beinhaltet 12 Events. Drei davon reagieren nur auf die Tastatur und sind nicht besonders spannend. Außerdem haben wir sechs Alarme. Schauen wir uns also die neun Events an.

Create-Event

Zunächst starten wir den Zufallsgenerator, bevor er vergessen wird. Wir brauchen drei Variablen für den Spieler. pw1 und pw2 sind die beiden Würfel, psum ist die Summe beider Würfel. Das Gleiche haben wir für das Casino. insertMoney ist ein Array. Der Spieler wird im Spiel in diesen sechs Schritten frei den Betrag wählen können, den er setzen möchte.  Die restlichen Variablen sind selbstredend.

Step-Event

Hier geht es darum, das Geld zu setzen. Gezeichnet wird das alles im Draw-Event, aber wir müssen ja irgendwo abfragen, was die Maus macht und ob sie an der richtigen Position ist.

Die Abfrage startet, wenn das Spiel noch nicht vorbei ist, der Spieler drücken darf und die linke Maustaste gedrückt wurde.

Dann fragen wir x- und y-Koordinate ab. Da sich alle Werte auf der selben x-Koordinate bzw. in einem Bereich befinden, müssen wir das nur einmal prüfen. Das ist unser if (mouse_x>room_width-120) && (mouse_x<room_width-40)

Die lokale Variable habe ich i genannt. Das soll auf die for-Schleife im Draw-Event Bezug nehmen. Nun prüfen wir, in welchem Bereich sich die Maus auf der y-Koordinate befindet, wenn die linke Maustaste gedrückt wurde. Entsprechend weisen wir i einen Wert zwischen 0 und 5 zu. Ist der Wert >-1, ziehen  wir der Variable playerMoney Geld ab und geben es der Bank. Das schauen wir uns im Detail an.

insertMoney haben wir im Create Event definiert. Ein Array mit 6 Werten. Arrays beginnen bei der Zählung mit 0. Ist i bspw. 1, nehmen wir den zweiten Wert aus dem Array. Im Beispiel sind das 10$. Die werden dem Spieler abgezogen (Zeile 1) und der Bank gegeben (Zeile 2).

Die Abfrage muss so „kompliziert” sein, weil der Spieler „irgendwo” links klicken kann. Also auch zwischen den Werten.

Draw-Event

Okay, das ist viel Code. Schauen wir es uns also in kleineren Blöcken an.

Der Anfang sollte klar sein. Wir zeigen das Logo an und machen das sogar mit einem kleinen Schatten (Zeile 2). Dann kommen die Grundeinstellungen für die Schrift, zuletzt wird das Geld und der Pott an Text unten angezeigt.

Der größte Block ist der Geldeinsatz. Wird nur angezeigt, wenn das Spiel noch läuft. Bei Game Over kommt ein kleines Fenster mit einem textlichen Hinweis, der ebenfalls mit Schatten versehen wurde.

Richten wir unsere Aufmerksamkeit auf die for-Schleife. Hier wird das angezeigt, was wir im Step-Event bereits abfragen. Zugegebenermaßen habe ich ich es anders herum programmiert. Erst die Anzeige, dann die Mausabfrage. Entscheidend sind hier zwei Dinge:

  1. Wenn die Maus über dem richtigen Geldbetrag ist, wird es rot eingefärbt. Ansonsten bleibt die Schrift weiß.
  2. Es werden nur die Werte angezeigt, die man tatsächlich ausgeben kann. Wenn ich nur 90$ habe, kann ich keine 100$ setzen.

Letzteres bewirkt die Zeile if (playerMoney >= insertMoney[i])

Hier zeigen wir die Würfel an. Für Spieler und Casino gibt es je eine Textzeile und zwei Würfel. Sie werden nur angezeigt, wenn der Würfelwert >0 ist. Die Werte regeln wir über die Alarme.

Wenn die Würfel gefallen sind, verkünden wir das Ergebnis. Dies machen wir einfach per Switch. Die entscheidende Variable ist endResult.

Alarme 0 bis 5

Damit das alles in so schönen Schritten abläuft, verwenden wir Alarme. Wir haben 6 davon. Alarm 5 setzt alle Werte zurück. Dieser Alarm wird im Step-Event aufgerufen. Von da aus geht es zu Alarm 0 und dann der Reihe nach bis Alarm 4, der Auswertung.

Alarm 5

Wir löschen das Resultat, setzen alle Werte auf 0, der Spieler kann nicht mehr spielen und es geht gleich weiter zu Alarm 0.

Alarm 0

Das war es schon. Für den Würfel nehmen wir choose(). Man könnte auch random_range() verwenden, aber das ist kaum kürzer, da man runden, mit 100 multiplizieren und dann wieder teilen muss. Sieht auch nicht so hübsch aus.

Alarm 1

Der zweite Würfel ist gefallen. Wir zählen noch die beiden Werte zusammen.

Alarm 2

Natürlich will auch das Casino würfeln.

Alarm 3

Und auch hier fällt der zweite Würfel und die Werte des Casinos werden addiert.

Alarm 4

Jetzt wird ausgewertet. Es gibt drei Zustände: gewonnen, verloren, unentschieden. Anschließend darf weiter gespielt werden, außer das Spiel ist vorbei.

Im Prinzip war es das schon. Die drei Events, die ich hier unterschlage, sind für die Tasten R, Esc und G, die den Raum neu starten, beenden oder das gameOver auslösen, damit man es beim Testen leichter hat.

Autor

Abonnieren
Benachrichtige mich bei
guest

0 Comments
Inline Feedbacks
Alle Kommentare anzeigen