Spiele-Programmierung - Rapid-Prototyping mit Processing
09.12.2014
Wenn es darum geht, möglichst schnell mit geringem Aufwand eine Spiel-Mechanik zu testen und dabei weder Low-Level Details programmieren zu müssen noch gleich eine Engine einzusetzen, dann ist Processing ein geeignetes Werkzeug. Mit einem passenden Ansatz lässt sich schon in wenigen Zeilen ein einfaches Spiel schreiben.
Das richtige Werkzeug
Um schnell mal eben einen Spiel-Mechanik Prototyp mit grafischer Ausgabe und Maus-Steuerung zu implementieren ist Processing sehr geeignet, eine auf Java basierte Programmiersprache und Entwicklungsumgebung, die den Entwickler vor einigen lästigen Details abschirmt. Processing wurde 2001 von Casey Reas und Benjamin Fry (früher am MIT Media Lab) ins Leben gerufen und ist kostenlos downloadbar unter http://processing.org/. Umfangreiche Dokumentation und Beispiele finden sich ebenfalls dort.
Das Spiel
Um Rapid Prototyping mit Processing an einem Beispiel zu demonstrieren verwenden wir eine Spiel-Mechanik ähnlich der des Atari-Klassikers Pong. Im Original, einer Tischtennis-Simulation, spielen sich zwei Spieler mittels zweier, nur senkrecht verschiebbarer, Balken gegenseitig einen Ball zu.
Unser Spiel, nennen wir es "Ping", ist dagegen nur für eine Person gedacht, die mit sich selber Tischtennis spielt, und beide "Schläger" synchron bewegt (es geht um Rapid Prototyping, nicht um den perfekten Pong-Klon!). Für jeden Treffer gibt es einen Punkt. Das Spiel endet wenn der Ball im Aus landet.
Aufbau
Zu simulieren sind der Ball und die (sehr vereinfachten) Schläger. Den Ball behandeln wir im wesentlichen als Partikel, beschrieben durch die Komponenten der Position x, y und Geschwindigkeit vx, vy. Zur besseren Sichtbarkeit machen wir aus diesem punktförmigen Gebilde einen Kreis mit Radius s. Die Schläger sind hier durch zwei Liniensegmente der Ausdehnung ty dargestellt, die sich an den Rändern der Bildes an der vertikalen Position padY befinden. Zu Visualisierungszwecken stellen wir diese als Rechtecke dar, denen wir die Breite tx geben.
Implementierung
Da es hier nur darum geht, eine Spiel-Mechanik an einem Prototypen zu testen, erlauben wir uns (im Gegensatz zu einem ernsthaften Programm) ein paar Abkürzungen: Zusammen mit dem aktuellen Punktestand score definieren wir x, y, vx, vy, s, tx, ty als globale Variablen. Diese Variablen enthalten alle Informationen, um den Zustand zu beschreiben, in dem sich das Spiel befindet.
Ein einfaches interaktives Processing-Programm besteht aus den beiden Prozeduren setup und draw.
Initialisierung
In setup wird als erstes ein Fenster geöffnet. Nach Einstellung allgemeiner Parameter, wie etwa der Schriftgröße, werden den globalen Variablen Startwerte zugewiesen: Der Ball befindet sich anfangs in der Mitte des Spielfelds und hat eine zufällig gewählte Anfangsgeschwindigkeit. Auch die Größe des Balls und die Maße der Balken sind hier definiert (in diesem Fall in Abhängigkeit der Fenstergröße, so dass das Spiel auch bei einer anderen Auflösung ähnlich aussieht).
Simulations-Schritt
Die eigentliche Arbeit findet in draw statt: Dieser Teil des Programms wird pro Frame ausgeführt (mit Standard-Einstellungen ca. 60 mal pro Sekunde). Mittels Euler-Verfahren (im Prinzip numerische Integration über die Geschwindigkeit) berechnen wir die aktuelle Position des Balls. Die Position der Schläger ist an die vertikale Koordinate der Maus gekoppelt (und die Geschwindigkeit näherungsweise durch die Differenz zur vorherigen Position bestimmt, geteilt durch den Betrag der zwischen zwei Frames vergangenen Zeit).
Berührt der Ball die Seitenlinie (hier umgesetzt mit stark vereinfachter a posteriori Kollisions-Erkennung: Erst wenn der Ball die Linie schneidet gilt dies als Kollision) sind zwei Fälle zu unterscheiden: Entweder der Ball befindet sich auf der Höhe des Schlägers, dann wird er durch Umkehrung des Vorzeichens der horizontalen Geschwindigkeits-Komponente voll elastisch reflektiert (und die vertikale Geschwindigkeits-Komponente der Schlägers auf die des Balls addiert, um dem Spieler zu ermöglichen, den Ball abzulenken). Andernfalls wird das Spiel mit dem Text GAME OVER beendet.
Schließlich sind Punktestand, Ball und Schläger mit wenigen Aufrufen an text, ellipse und rect schnell gezeichnet.
Der gesamte Quellcode des Spiel-Mechanik Prototyps passt bequem in 64 Zeilen.