London
3D-Tetris wie Computerspiele im Allgemeinen ist ein mit Spaß kombinierter Anwendungsfall für Engines. Wie dieses Anfängerprojekt dieses Konzept der Computer Grafik umsetzt, stelle ich auf dieser Website vor. Mein Name ist David Jäck, ich bin 21 Jahre alt, studiere an der Universität Heidelberg Angewandte Informatik und ich bin der Schöpfer dieses Projektes.
LWJGL
Zwecks meiner, bis dahin, recht mauen Erfahrung habe ich als aller ersteres ein Prototyp implementiert. Er hat mir massiv geholfen genauer definieren zu können, wie ich das Spiel entwickeln möchte. So hat sich zum Beispiel ergeben das meine Ambitionen an die graphische Abbildung des Spiels höher waren als gedacht war. Da als Implementationssprache Java ausgewählt war, war damit klar, dass ich ein Framework benutzen muss, das mich bei graphischen Berechnungen und dem Rendern des Spiels unterstützt. Hierfür fiel die Wahl schließlich auf die Java Lightweigth Game Library.
Spielregeln
Wie 3D-Tetris funktioniert lässt sich bereits zu großen Teilen vom Namen ableiten, da dieser in vielerlei Hinsicht spezifiziert wie das Spiel ab zu laufen hat. Denn zunächst implementiert 3D-Tetris einmal alle Mechanismen und Regeln, die das originale Tetris implementiert.
Das Spiel zeigt einem Spieler ein Spielfeld mit fester Größe an. Dieses Spielfeld ist in freie Plätze unterteilt und damit diskretisiert. Die freien Boxen des Spielfeldes lassen sich mit Spielsteinen füllen. Hierbei erscheinen neue Spielsteine immer ganz oben im Spielfeld. Der Spieler kann zu einem Zeitpunkt den zuletzt erschienenen Spielstein bewegen und rotieren. Spielsteine bewegen sich immer vom oberen Spielfeldrand nach unten und der Spieler kann diesen so lange manipulieren bis er in Richtung Unten mit dem Spielfeldrand oder einem anderen Spielstein kollidiert. Da auf diese Weise immer mehr Spielsteine auf Feld gelangen und das Spiel als verloren gilt, wenn kein neuer Spielstein ohne Kollision in das Feld eintreten kann, ist es das Ziel des Spiels Spielsteine wieder aufzulösen. Dies erreicht der Spieler, indem er einen waagerechten Abschnitt gänzlich mit Spielsteinen füllt. Dann und nur dann werden alle Spielsteine diese vollgefüllten Ebene entfernt und der Spieler wird mit Punkten vergütet. Schafft der Spieler es eine gewisse Anzahl an Ebenen gänzlich zu füllen steigt er im Level auf und die Geschwindigkeit, mit der sich der aktuell manipulierbare Stein nach unten bewegt erhöht sich. Dafür erhält der Spieler nun mehr Punkte als zuvor - genau wie, wenn er mehrere Ebenen durch das Platzieren eines einzelnen Steines füllt.
Kamerabewegung
Damit das Spiel überhaupt erst spielbar wird, reicht es allerding noch nicht dem Spieler lediglich die zusätzlichen Einflussmöglichkeiten zu geben, die die neue Dimension mit sich bringt. Nein, der Spieler muss auch dazu in der Lage sein, das Spielfeld in einer solchen weise zu überblicken, dass er alle Spielsteine und freie Plätze erkennen kann. Dies ist bei eine auf den zweidimensionalen Bildschirm projizierten Welt nicht initial gegeben. Um dies zu bewerkstelligen kann der Spieler auf einer Kreisbahn um das Spielfeld herumfahren. Durch diese relative Blickwinkeländerung ändern sich links, rechts, vorne und hinten in solch einer Weise, dass der Spieler bei Bedarf jeder Zeit „hinter“ einen gegebenen massiven Spielblick blicken kann.
Demo
Damit das Spiel überhaupt erst spielbar wird, reicht es allerding noch nicht dem Spieler lediglich die zusätzlichen Einflussmöglichkeiten zu geben, die die neue Dimension mit sich bringt. Nein, der Spieler muss auch dazu in der Lage sein, das Spielfeld in einer solchen weise zu überblicken, dass er alle Spielsteine und freie Plätze erkennen kann. Dies ist bei eine auf den zweidimensionalen Bildschirm projizierten Welt nicht initial gegeben. Um dies zu bewerkstelligen kann der Spieler auf einer Kreisbahn um das Spielfeld herumfahren. Durch diese relative Blickwinkeländerung ändern sich links, rechts, vorne und hinten in solch einer Weise, dass der Spieler bei Bedarf jeder Zeit „hinter“ einen gegebenen massiven Spielblick blicken kann.
Game Engine
Mit LWJGL habe ich also die Engine entwickelt die für die anzeige des Spiels verantwortlich ist. Diese habe ich auch zuerst implementiert, um später bei der Implantation der Spiellogik genau zu wissen welche Operationen für mich implementierbar sind. Wie die Engine funktioniert habe ich bereits detailreich in meiner Präsentation meines Projektes am 17.01.2022 vorgetragen weshalb ich an dieser Stelle nur einen groben überblick geben werde und des Weiteren auf den Foliensatz der Präsentation verweise:
Die Engine ist für das Darstellen des Spiels verantwortlich und bewerkstelligt dies wie folgt. Unabhängig von der Klasse die Objekte des Spiels haben, werden dieses mit ihrem Modell und Texturdaten auf die Grafikkarte geladen und so genannte Shader berechnen anhand von diesen Daten welche Farbe jeder Pixel des Bildschirms haben sollte. Zu erwähnen bleiben hierbei nur noch die zwei Typen von Shadern: einmal der Vertex Shader, der für die Eckpunkte der Objekte ausführt und einmal der Fragment Shader der für alle Pixel des Bildschirms ausführt.
3 dimensionales Tetris
Wie bereits ausgeführt ist es also für das Verständnis des Spiels weniger zentral an dieser Stelle weiter auszuführen wie Tetris allgemein funktioniert, sondern inwiefern sich 3D Tetris unterscheidet:
Das „D“ in 3D Tetris steht für dimensional und im Vergleich zum herkömmlichen Tetris das zwei Dimensionen kennt hat mein Projekt eine Dimension mehr. Im Spiel gibt es nicht nur links oder rechts und oben oder unten, sondern auch vorne oder hinten. Damit wird aus dem 10x20 Quadrate großen Spielfeld ein 10x10x20 Würfel großes Spielfeld. Der Spielstein, der vom Spieler manipuliert werden kann, kann nicht nur nach links, rechts und unten bewegt werden, sondern auch nun vorne und hinten. Des Weiteren kann der Spielstein nicht nur um die Achse, die aus dem Bildschirm heraus zeigt, herum rotiert werden, sondern auch um diese die senkrecht nach oben zeigt und um die, die horizontal durch den Stein zeigt. Um Spielsteine aufzulösen, muss nicht mehr eine Reihe aus 10 Quadraten gefüllt werden, sondern eine Ebene aus 10x10 Würfeln.
Kollisionserfassung
Das Erfassen von Kollisionen ist allgemein ein nicht unerheblicher Teil von Game Engines. Im Fall von 3D-Tetris ist eine aufwendige Berechnung von Hit boxen jedoch erfreulicher Weise nicht nötig. Durch den geschichtlichen Hintergrund von Tetris ist das Spielfeld in einer solchen Art diskretisiert, dass die Position von Spielsteinen immer dieselbe zuvor bereits Definierte ist. Damit lässt sich eine Kollisionserfassung wie folgt abbilden. Soll für einen Zustand geprüft werden, ob eine beabsichtigte Operation erlaubt ist, kann diese testweise simuliert werden. Ist dieser Zustand nach den Regeln des Spieles immer noch akzeptabel so darf die Operation auch tatsächlich ausgeführt werde. Ist der Zustand ungültig wird die Ausführung der Operation abgewendet.
Das einfachste Beispiel ist hierfür der Spielbeginn. Ist der erste Spielstein hier am unteren Ende des Spielfeldes angekommen, so wäre der nächste hypothetische Zustand der, in dem der Spielstein sich eine weitere Ebene nach unten bewegt und damit das Spielfeld verlässt. Dieser unzulässige Zustand würde erkannt werden und die weitere Bewegung der Spielsteinen nach unten kann durch den bekannten Spielanlauf abgewendet – der Spielstein gilt als platziert und ein nächster Spielstein erscheint am oberen Spielfeldrand.