Java game engine Erklärung?

1 Antwort

Für ein Spiel wie Super Mario brauchst du nicht zwingend eine komplette Engine, so viel vorweg.

Eine Game Engine setzt sich im Grunde aus verschiedenen Teilkomponenten zusammen, die jeweilige Aufgabenbereiche übernehmen, die für ein Spiel wichtig sind. Man kann zwar eine Kollektion an Kernkomponenten benennen (was ich auch gleich tun werde), aber nicht jede muss zwingend in jeder Engine vorhanden sein, denn nicht jede wird immer gebraucht. Eine Spiel-Engine für ein reines Text-Adventure ohne Ton benötigt bspw. keine Audio-Engine.

Zu der Auflistung üblicher Kernkomponenten:

  • Ein System für die De-/Serialisierung von Daten (seien es Speicherstände oder die übliche Spiele-Konfiguration)
  • Ein System für die Datenverwaltung (z.B. für Grafiken, Sounds, ...)
  • Eine Grafik Engine (die dafür sorgt, dass deine Grafiken und Texte irgendwie auf den Bildschirm kommen)
  • Eine Audio Engine (für das Abspielen von Sounds / Musik)
  • Ein Physik-System (wie realistisch das physikalische Gesetze umsetzt, sei einmal dahingestellt)
  • Ein System, welches Eingaben verarbeitet (seien sie von der Tastatur, dem Controller. ...)
  • Oft (aber nicht immer!) gibt es eine Scripting Engine. Das heißt, um die Spiellogik zu formulieren, wird eine andere, leichte Programmiersprache verwendet, deren Funktionsrahmen zudem durch die Engine bestimmt wird

Zusätzlich könnten noch weitere Module ergänzt werden, die bspw. die Engine mit einem Editor ausstatten, über den die Spielszenen leichter zusammengestellt werden können oder Funktionalitäten für die Kommunikation über Netzwerk (für Multiplayer-Spiele).

Vor allem bei proprietären Engines (die also firmenintern entwickelt wurden) war der Ursprung einer Engine meist mit dem Ziel verknüpft, ein sehr konkretes Spiel zu erstellen. Das Gerüst, was dabei entstanden ist, war daher immer sehr an das spätere Produkt gebunden / orientiert. Die Grenze zwischen dem eigentlichen Spieleprojekt und der Engine ist somit manchmal recht schmal.

Gerade in den vergangenen ~15 Jahren sind aber auch mehrere Engines entstanden, nicht unbedingt auf ein bestimmtes Spiel ausgelegt sind, sondern mit ihren Tools das Entwicklungsfeld breiter abdecken. Populäre Beispiele hierfür wären Unity3D, die Unreal Engine oder die Cry Engine (natürlich gibt es noch viele mehr). Sie stellen also solche Komponenten wie die oben genannten auf jeden Fall bereit und oblassen es den Nutzern, wie sie damit ihre Spiele erstellen. Ein Vorteil, den einige bieten (z.B. Unity), besteht zudem in der Anpassbarkeit. Unity lässt sich durch Plugins (nahezu) beliebig erweitern, was vor allem von Indie-Softwareherstellern gern genutzt wird.

So viel erst einmal als grober Abriss zu einer Game Engine. Auf die konkrete / interne Funktionsweise der einzelnen Komponenten werde ich allein aus Platzgründen nicht eingehen, darüber kann man, wenn man möchte, Bücher schreiben. Das haben einige auch getan, bzw. zur Software-Architektur solcher Anwendungen.

Siehe z.B.:

  • Game Engine Architecture (von Jason Gregory)
  • Game Programming Patterns (von Robert Nystrom)

Und dann gibt es noch die ziemlich gute Gems-Reihe, die in der Regel aber ziemlich teuer ist. Ebenso lassen sich die einzelnen Bücher nicht mehr überall zum Verkauf finden.

Ob es deutsche Literatur gibt - womöglich. Dazu müsstest du aber selbst einmal recherchieren.

Was ich an der Stelle noch empfehlen könnte, wäre das ECS, mit dem du dich etwas vertraut machen könntest.

Aber nun erst einmal zurück zu Java und dann auch Super Mario.

In Java gibt es nur wenige frei verfügbare Engines. Da wäre einmal die jMonkeyEngine (abgekürzt: JME) und zum anderen die LITIEngine, die sich auf 2D-Spiele beschränkt. Wenn du weiter suchst, wirst du vermutlich noch andere Projekte finden (z.B. jPCT für Android; GitHub-Projekte wie OpenRTS), doch zumeist handelt es sich da um Anwendungen, die veraltet sind / deren Entwicklungsstand ungeklärt ist (z.B. JGame, GTGE, EasyWay Game Engine).

Neben JME wäre das libGDX-Framework die populärste Java-Lösung oder die LWJGL-Bibliothek (worauf die meisten Spieleentwicklungstools in Java basieren). Ansonsten ließen sich noch Bibliotheken wie FXGL, Processing und slick2D (für sehr kleine Spiele) benennen.

Der Unterschied zu einer Engine liegt darin, dass Frameworks/Bibliotheken in ihrem Umfang an Funktionalitäten kleiner gefasst sind. Während bei einer Engine z.B. noch die Chance besteht, dass die Entwickler einen grafischen Editor angefügt haben, fällt so etwas hier völlig weg. Du musst dich also um mehr selbst kümmern und so gut wie alles im Quellcode lösen. Betrachte das aber nicht zwingend als Nachteil. Für kleines Spiele (Pong, Tetris, Pacman, Super Mario) reicht ein kleines Toolset völlig aus.

Wenn du übrigens sehr viel Interesse daran hast, die unteren Ebenen zu erkunden (also bspw. mit der OpenGL API etwas persönlicher plaudern möchtest), nutze JOGL. Einfach, so viel vorweg, ist das nicht und mit objektorientierter Programmierung hat es dann auch immer weniger zu tun.

Zu Super Mario: Hierbei handelt es sich ja grob ausgedrückt nur um 2D-Lauf-und-Hüpf-Spiel. Das heißt, an der Stelle mit einer 3D-Engine wie JME aufzuschlagen, wäre eher ein unnötiger Overkill.

Ich würde dir entweder zu Processing raten oder zu libGDX. Mit Processing meine ich an der Stelle aber nicht wirklich Processing (du willst ja mit Java arbeiten), sondern ich rede eher davon, dass du dir dessen Kernbibliothek luxen und in dein Projekt einfügen könntest. Wie das in Eclipse geht, wird hier beschrieben, aber du kannst die Anleitung auch auf andere IDEs (NetBeans, IntelliJ, ...) übertragen. Zudem findest du dort die notwendige Grundstruktur.

Processing nutzt sogleich auch die Struktur, wie du sie in der Spieleprogrammierung oft erleben wirst. Es gibt eine zentrale game loop (im Grunde also eine Schleife, die immer und immer wieder läuft) und je Iterationsschritt zeichnest du etwas auf der Zeichenfläche (denk an ein Daumenkino). Processing bietet dir die notwendigen Methoden zum Zeichnen, eine Referenz findest du hier.

Ein Tutorial zu Super Mario in Processing findest du hier, aber ich würde dir vorerst eher zu Folgendem raten:

  • Probiere dich zunächst selbst etwas daran, Objekte zeichnen und sich bewegen zu lassen (allein / via Tastendruck).
  • Du könntest Pong als erstes Spiel wählen, mit dem du dich befasst.
  • Mache dir bezüglich des Super Mario-Spiels zunächst selbst Gedanken: Welche Spielkomponenten brauchst du? Welche Methoden sollten sie haben? Halte diese Planungen schriftlich in irgendeiner Form fest (seien es Skizzen, Diagramme, o.ä.).
  • Fange grob an, fokussiere dich zuerst auf die Kernfunktionalitäten. Ob es nun ein Viereck ist, welches hin- und herhüpft oder ein Mario mit trippelnden Watschelfüßen - der Feinschliff hat Zeit und kann später kommen. Wenn du sofort damit beginnst, verlierst du eher das Ziel aus den Augen und musst bei aufkommenden Systemänderungen plötzlich wieder alles neu machen.

BerndDerSwagger 
Fragesteller
 11.12.2020, 14:12

Vielen Dank für Deine ausführliche Antwort und Deiner Zeit :) !

Ich werde mir die Links auf jeden Fall anschauen und wie schon gesagt,

mich ehrt mal mit kleineren Spielen wie Pong beschäftigen.

Zuerst einmal lerne ich Java über mein Buch und über JetBeans.

Später kann ich mir dann über die Links das ganze aneignen :D

0