Lohnt es sich, Computerspiele mit Java zu programmieren?
Guten Tag,
ich bin nun seit zwei Jahren dran, Java zu lernen. Ich habe das Ziel, ein Spiel zu programmieren.
Es gibt dafür ja z.B. die Unreal Engine oder Unity, die aber nur mit c++ und c# laufen. Gibt es so eine Engine auch für Java oder brauch man überhaupt keine Engine dafür? Wäre es ggf. sogar sinnvoller zusätzlich c++ oder c# zu lernen und dann mit einer der erwähnten Engines zu programmieren?
Vielen Dank im voraus.
5 Antworten
Gibt es so eine Engine auch für Java (...)
Naheliegend wäre da die jMonkeyEngine oder (nur für 2D) die LITIEngine. Andernfalls gibt es Bibliotheken/Frameworks wie libGDX, FXGL oder LWJGL.
(...) oder brauch man überhaupt keine Engine dafür?
Zur Spieleprogrammierung benötigst du nicht unbedingt eine Game Engine wie Unity o.ä.. Du kannst dir dein Toolset auch selbst zusammenstellen. Sei es mit irgendwelchen Bibliotheken oder eigenen Funktionen.
Wäre es ggf. sogar sinnvoller zusätzlich c++ oder c# zu lernen und dann mit einer der erwähnten Engines zu programmieren?
Es wäre sinnvoll, erst einmal zu analysieren, was du für tatsächliche Anforderungen an dein Spiel stellst. Lege ein Game Concept an, welches dir bei der Planung hilft.
Zur Spieleprogrammierung mit Java generell habe ich hier schon einmal etwas geschrieben: Warum ist Java für Spiele nicht so gut?
Zur Spieleplanung hier: Was brauche ich, um ein Spiel zu entwickeln?
Sollte man eher die Engine oder die Frameworks bevorzugen? Und gibt es gute Tutorials für beides?
Ich habe gerade gesehen, dass es mehrere "Arten" der Engine gibt. Einmal jMonkeyEngine SDK, dann Binaries, um die Engine in einer IDE zu benutzen, und dann alleine die Engine Sources, um sich dadurch eine eigene zu bauen. Was wäre die beste Wahl?
In der Getting Started-Sektion werden drei Optionen angeführt: Ein Download, bei dem das SDK an die NetBeans IDE ausgerichtet ist (diese ist also dann dein Code-Editor), ein extra Download der Bibliotheken oder die Einbindung via Gradle (über ein Maven Repository).
Die beste Wahl ist m.E. der dritte Weg über Maven oder Gradle. Ob du dein Maven- oder Gradle-Projekt nun mit Eclipse, IntelliJ oder NetBeans erstellst, steht dir dann frei. Maven und Gradle sind jeweils Projektverwaltungstools, die dir das Management von externen Abhängigkeiten vereinfachen sowie Projektstrukturierung und Buildtasks.
Bei Java sind libGDX und JME (jMonkeyEngine) die populärsten Tools. JME wurde für 3D-Spiele ausgelegt, libGDX ursprünglich hingegen für 2D. Inzwischen sind ebenso Basisfunktionen für 3D dazugekommen, doch ist JME im Vergleich auf dem Gebiet noch immer ausgereifter.
Erste Anlaufstelle sollte die offizielle Dokumentation auf den Webseiten beider Tools sein. Dort sind auch Tutorials verlinkt / enthalten. Ob du passende/aktuelle Tutorials auf Udemy, Lynda, YouTube, o.ä. findest, kann ich nicht sagen. Sowohl libGDX als auch JME haben in diesem Jahr einen Versionssprung gemacht.
Kann man die beiden auch kombinieren? Also Features aus JME und libGDX zusammen verwenden?
Und habe ich das richtig verstanden, dass der beste Weg JME zu benutzen ist, diese via Maven oder Gradle z.B. in Eclipse zu integrieren? Gibt es dazu irgendwo Tutorials?
Allein den Versuch würde ich nicht als sinnvoll erachten. Beide nutzen ihre eigenen Pipelines. So hat libGDX bspw. seine eigene Zeichenfläche und JME ebenso.
Das wäre der Weg, den ich bevorzugen würde.
Ein paar Maven-Tutorials/Artikel:
- https://www.baeldung.com/maven
- http://tutorials.jenkov.com/maven/maven-tutorial.html
- https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
Ein paar zu Gradle:
Im Grunde reicht es aus, ein Maven-/Gradle-Projekt anzulegen (deine IDE hat Projekttemplates dafür in petto) und dann die Dependencies in der pom.xml / build.gradle anzugeben. Danach ist nur noch ein Projekt Build vonnöten. Lies aber dennoch einen der oben verlinkten Artikel.
Vielen Dank! Das wird mir erst mal sehr helfen😅 Wenn nicht frage ich nochmal nach.
Außerdem ein frohes neues Jahr
Im neuen Jahr gleich eine Frage: Ersetzt JME den Gebrauch von JavaSwing oder JavaFX?
Im Hinblick auf das Zeichnen deiner Oberfläche: Ja. Wenn du nach UI-Komponenten suchst (z.B. für ein Menü oder eine Highscore-Liste in deinem Spiel), schau dir Nifty GUI, tonegodgui oder Lemur an. Das sind für JME angepasste GUI-Toolkits.
Für Anwendungen, die kein Spiel werden sollen, wäre JME allerdings kein guter JavaFX-Ersatz.
Müssen Dateien z. B. von FXGL heruntergeladen werden, um über Maven oder Gradle die jeweilige Bibliothek in das Projekt einzubinden?
Du selbst musst nichts herunterladen. Das machen Maven/Gradle für dich während des Buildvorgangs. Du brauchst nur die Dependency in der pom.xml / build.gradle setzen, die hier auch vorgegeben wird.
Ich habe jetzt mal ein Maven-Projekt erstellt und da sind jetzt viele unterschiedliche Ordner. Wo speichert man was ab? Und was ist z.B. die Aufgabe vom target-Ordner?
Dein Hauptentwicklungsverzeichnis ist src/main/java. Darunter kommen all deine Klassen / Packages. Programmressourcen wie Bilder, Textdateien, o.ä. wandern in src/main/resources.
Der target-Ordner wird von Maven befüllt. Nach einem Build findest du dort die aus dem Prozess resultierenden Dateien.
Weitere Informationen, auch zu den anderen Ordnern, kannst du in der Maven Dokumentation nachschlagen. Oder in diesem Artikel.
Kann man in JME auch Pixel Art Spiele erstellen oder sollte ich dafür auf eine andere Engine/Bibliothek setzen?
In JME sind auch 2D-Spiele möglich und den Stil der Grafiken bestimmst du doch selbst.
Kennst du gute Tutorials für die LITIengine? Da diese speziell für 2D Spielen erstellt wurde, wollte ich sie mir mal anschauen und habe auch einen guten ersten Eindruck.
Ich habe mir schon die Website angeschaut, doch ist dort die Einführung nicht vollständig. Auch die Tutorials habe ich mir angeschaut, doch wird da ein Programm verwendet, das die Schöpfer der Engine bereitstellen, was ich mir aber definitiv nicht herunterlade, da mehrer Virenscanner angeschlagen haben.
Nichtsdestotrotz wird erwähnt, dass man dieses Programm nicht unbedingt braucht. Deshalb suche ich jetzt Tutorials genau dafür.
Ich hoffe wirklich, dass du einige Seiten/ Videos kennst.
Eine andere Quelle als die Dokumentation kenne ich nicht. Auf das eine Tutorial-Video und den GitHub-Account von Gurkenlabs wird dort meines Wissens bereits verwiesen. Ich denke, so einiges wird sich über deren Discord oder Twitter abspielen. Generell ist Kontakt, so wie ich es aus Beiträgen der Entwickler herauslese, erwünscht. Da sie aus Bayern kommen, dürfte sich die Kommunikation nicht schwer gestalten.
Du meinst vermutlich den utiliti-Editor, der in der Dokumentation aufgeführt wird. Der ist Bestandteil des SDK. Vermutlich wird er auch mit gezogen, wenn du dir das Projekt via Maven oder Gradle in dein Projekt einbindest. Auf jeden Fall kannst du dir dessen Quellcode auf GitHub genauer anschauen.
Wie man ihn ersetzen kann, wird am besten im FAQ geschildert.
Wäre es also möglich, dass ich mir den Code von dem utiliti-Editor von GitHub herunterlade und dann daraus eine eigene Anwendung mache, also den Code in eine .jar File packe?
Ich habe das jetzt mal versucht und es hat nicht geklappt.
Beim ersten Versuch habe ich es mit Gradle versucht, weil im Download eine build.gradle Datei dabei war, doch waren in dem Quelltext viele Fehler vorhanden, da die Bibliothek, die benötigt wird, nicht vorhanden war.
Bei Maven waren schon einige Fehler verschwunden, doch wurde auch dort ein Package/ eine Klasse importiert, die ich nicht gefunden habe. (Der Name war: com.github.weisj.darklaf.components.border.DarkBorders)
(Den heruntergeladenen Ordner kann ich auch nicht importieren)
Ich weiß auch leider dieses mal nicht weiter. Ich hoffe du kannst mir wieder helfen.
Es fehlt jetzt nur noch die Klasse de.gurkenlabs.litiengine.test.SwingTestSuite
Die wird in einer Test-Klasse mit @ExtendWith(SwingTestSuite.class) hinzugefügt.
Ist der Code wichtig oder kann dieser einfach problemlos entfernt werden?
Zur Spieleprogrammierung benötigst du nicht unbedingt eine Game Engine wie Unity o.ä.. Du kannst dir dein Toolset auch selbst zusammenstellen. Sei es mit irgendwelchen Bibliotheken oder eigenen Funktionen.
Zum Lernen oder Spaß an der Freude würde ich fast schon sagen: Man sollte eine eigene Engine schreiben.
Aber wenn daraus tatsächlich ein produktives Spiel werden soll, sollte man mMn. immer auf bestehende Engines setzen, außer man weiß was man tut, hat Erfahrung auf dem Gebiet und einen guten Grund, warum bestehende Engines nicht in Frage kommen.
Bitte lies eine der beiden folgenden Seiten:
- https://www.programmierenlernenhq.de/java-spiel-programmieren-tutorial/
- http://www.petrastumpf.de/michael/Wissen/SpieleprogrammierungInJava.pdf
Welche die für deinen Zweck nützlichere Anleitung darstellt, musst du selbst entscheiden.
Gibt es noch Dateien, die die in Link 2 im Anhang erwähnten Punkte (1. Einführung in Java Swing, 2. Einführung in Java 2D, 3. Einführung in Java 3D) nochmal seperat abdecken?
Zu Java Swing: http://www.petrastumpf.de/michael/Wissen/Swing.pdf
Ich denke, erstmal solltest Du Dich mit dem Spielprinzip auseinandersetzen. Was braucht Dein Spiel? Dann weißt Du auch, was Du an Technik dafür brauchst.
Minecraft ist in JAVA Programmiert.
JAVA ist C# und C++ recht ähnlich. Aber brauchst Du so eine große Engine? Finde das vorher heraus.
JAVA ist C# und C++ recht ähnlich
Nein, gar nicht.
Die Syntax mag zwar ähnlich sein, aber die ist der kleinste Teil neben den riesigen anderen Unterschieden. Und selbst die Syntax unterscheidet sich immer mehr, C# ist bei dem Punkt komplexer als Java und C++ nochmal eine Ecke mehr.
Also, JAVA ist C# um Einiges ähnlicher als Python, Scheme, Haskell, Scala...
Ja KLAR haben die Unterschiede. Aber Syntaktisch und von der Semantik sind die einfach viel näher aneinander als sehr viele andere Sprachen.
Wie gesagt:
Die Syntax mag zwar ähnlich sein, aber die ist der kleinste Teil neben den riesigen anderen Unterschieden.
Es hat noch nie ausgereicht, nur die Syntax zu lernen, danach geht die Arbeit doch erst richtig los. Features, die es (nicht) gibt, Features die gleich klingen, aber anders ticken, Framework-Unterschiede, übliche Vorgehensweisen, die auf Basis der Feature-Unterschiede entstanden sind, etc.
Aber ja, sie mögen sich ähnlicher sein, als zu anderen Sprachen, aber "recht ähnlich" sind sie deshalb noch lange nicht. Das waren sie vielleicht mal vor 15 Jahren, doch seit ein paar Jahren hat sich C# noch zusätzlich zu den bereits vorhandenen Unterschieden immer mehr in Richtung C++ entwickelt - soweit es zumindest möglich ist.
Jo, das ist so bischn wie die Leute, die sagen: Spanisch ist ne gannnnz andere Sprache als Französisch!
Ja, klar, aber verglichen mit Japanisch und Russisch sind die beiden Sprachen schon richtig nah aneinander dran.
Wenn du Java kannst ist es nicht weit bis C++. Mit der etwas anderen Speicherverwaltung musst du dich beschäftigen und dem Prinzip von Zeigern. Ich würde auf jeden fall C++ verwenden.
Die Sprache ist viel komplexer als das nur Speicherverwaltung und Zeiger dazu kommt.
Für große Projekte lohnt es sich, sich intensiv mit seiner Sprache auseinanderzusetzen.
Nicht wirklich, ich programmiere seit 30 Jahren C++. Ja sie ist etwas komplexer aber das ist nichts was man als Programmierer nicht schnell drin hätte.
Naja, vor 30 Jahren sah C++ noch ganz anders aus. Dann sind die Sprünge zu den neueren Sprachfeatures nicht so groß, wenn man sich die Sachen über die Jahre anliest in kleineren ,,Häppchen"
Habe mich mit C++ letztes Jahr etwas intensiver beschäftigt, kam davor aus der Javaecke: Von classes zu Vererbung, Zeigern, byReference und Constructoren, copy constructoren, move constructoren, Templates, etc. Bin noch lange nicht :D, hab in der Zwischenzeit wieder aufgehört und bin derzeit mit Python beschäftigt.
Mit entsprechender Lektüre kommt man sicherlich voran. Meine Erfahrung zeigt halt, dass sich Projekte besser strukturieren lassen wenn man sich in einer Sprache sehr gut auskennt, sprich die Feinheiten, Vererbung, etc. Speicherverwaltungen lassen sich selbst schreiben, klar, es gibt eben auch Konstruktionen wie Shared oder UniquePointer die einem dann doch helfen in diversen Situationen, wäre schade wenn man das nicht nutzt. Vielleicht ist es nur mein Fetisch, bin noch nicht im Beruf, weiß nicht wie wichtig das dort ist.
Kann sich schon lohnen, ja. Öffentlich zugängliche Engines wären mir dafür zwar nicht bekannt, aber das heißt nicht, dass es sie nicht gäbe.
Eine weitere Programmiersprache irgendwann zu lernen ist aber sicherlich auch nicht verkehrt.
Was es für Java gäbe wäre LWJGL. Das enthällt alles nötige, um ein Spiel zu programmieren.
Ein Tutorial findet sich hier:
https://lwjglgamedev.gitbooks.io/3d-game-development-with-lwjgl/content/
Kann man jMonkeyEngine gut benutzen? Also ist sie übersichtlich und schnell zu erlernen?