Java Richtiger Einstieg in Spieleprogrammierung

te one

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.252
Guten Tag,

ich möchte als Vorbereitung auf mein Informatik-Studium meine Java-Kenntnisse stark erweitern. Da ich schon in anderen Sprachen programmiere (PHP, Python) sind die Grundlagen klar, würde mir jedoch gerne durch den praktischen Einsatz von Java das ganze einverleiben. Habe mir da ein 2D RPG vorgestellt - anfangs ganz simpel und auf lange Sicht evtl. mit Multiplayer-Modus und Handy-App.

Wie starte ich nun richtig und ohne großen Aufwand um im Laufe der Entwicklung nicht unnötig Hindernisse im Weg zu haben?
Habe mir schonmal kurz libgdx angesehen, das scheint recht ordentlich zu sein.
Gibt es für solche Entwicklungen eine Art "Standard"/"Grundgerüst", der mir dann evtl. auch später beruflich mal weiterhilft?

Wenn man sich so im Netz umsieht findet man viele Tutorials - doch jeder zieht das etwas anders auf. Möchte nun einfach nicht schon suboptimal beginnen...


Gruß
Michael
 
Hi,

wenns nicht unbedingt Java sein soll würde ich stattdessen C# mit MonoGame empfehlen:
+ Java und C# sind sich recht ähnlich (bringt dir also auch was für Java)
+ MonoGame bietet eine solide Grundlage, um direkt einsteigen zu können
+ MonoGame versucht Microsofts XNA nachzubilden, dessen Tutorials passen oft auch auf MonoGame
+ Mit MonoGame kann (mit Xamarin) auch auf Smartphone / Tablet released werden

Ansonsten wird meißtens eine Statemachine mit folgendem Aufbau verwendet:

1. Initialisieren (Systeme aufbauen und initialisieren)
2. Laden (Essentielle Daten laden)
3. Spiellogic updaten
4. Spiel zeichnen
5. Entladen (Spieldaten entladen)
6. Beenden (Prozess beeden)

3 und 4 zusammen ist die sogenannte Gameloop
und wird normalerweise als Schleife mit abbruch Bedingung konstruiert,
wird die Schleife verlassen wird mit 5 und 6 fortgesetzt.

MfG T2xlc
 
Würde auch zu C# raten (wie gesagt Java fast 1:1 ähnlich mit nur kleinen UNterschieden).
Da kannst du dann auch mit Unity recht schnell was "ernstes" präsentieren :)
 
Eine gute Engine würde ich als Voraussetzung nennen.
Habe mal ein etwas komplexeres Spiel programmiert, jedoch war der Aufwand auf Grund nicht wirklich vorhanden sein einer sinnvollen Grafik und Physik Engine gigantisch (beides war Eigenleistung).

Wenn das Ergebnis cool sein soll, kann ich dem Tipp von T2xlc folgen.
Microsoft bietet gewohnt schöne Tutorials an.

Weil der Schwierigkeitsgrad verglichen zu normalen Phyton und PHP Anwendungen ist schon recht hoch.
Anwendungen zu schreiben ist meistens deutlich einfacher.

Kommt halt darauf an was das Spiel können soll.
 
Also libgdx ist schonmal ganz gut, aber zum lernen von Syntax nicht wirklich effektiv. Das wichtigste ist aber das du Quelltext schreibst, Probleme löst und dabei Spaß hast und wenn dich Spieleprogrammierung am Ball hält, dann mach das eben. Für dein Informatik Studium werden deine Java Kenntnisse aber nicht so wichtig sein.
 
Du wirst mich hassen, aber der Einstieg in Spieleprogrammierung heißt "Lineare Algebra" (Matrizen / Vektoren, wie GPUs halt so rechnen) und später "Computer Grafik" :) Bücher gibt es für beides, als Student mit Sicherheit auch kostenlos als Ebook über die Uni.

Wenn man dann weiß was man da eigentlich tut (z.B. was macht Double Buffering?), sind die Funktionen (API) später das kleinste Problem.

Spieleprogrammierung ist allerdings nicht unbedingt Informatik, da lernt man bestenfalls mal kurz die Grundlagen (Java SWING +AWT) kennen und fertig. Hauptteil eines Info Studiums ist Mathe und Mathe ähnliche Logik Dinge wie Automatentheorie und Diskrete Mathematik (Logik um Mengen, Bäume, Pfade usw.), um damit dann zu verstehen wie Prozessoren, Betriebssysteme, Datenbanken usw. unter dem Hut arbeiten. Programmieren ist nur das Werkzeug dazu (außer im 1/2 Semester bei den Grundlagen).

Game Design wäre für Spiele der bessere Studiengang.

Wenn Informatik lerne lieber: Rekursion, z.B. die Klasse List von Java nachbauen, eigene Bäume (Suchbaum), Iteration über diese in pre-, post-, in- und levelorder. Je nach Uni/FH auch C lernen wie Pointer und Malloc arbeiten und wie man damit eigene Strings erstellt ;). Das waren so die Dinge wo die meisten dran zerschellt sind. Was ein Stack und Heap ist wäre auch hilfreich fürs Verständnis.
 
Zuletzt bearbeitet von einem Moderator:
Bin ich richtig informiert, dass C# auch nativ auf Android-Devices läuft? Warum wird dann hier (oder falsche Info?) i. d. R. auf Java gesetzt?

Um das Thema etwas zu vereinfachen: Ich bin bereits Fachinformatiker und schließe nun nach mehrjähriger Berufstätigkeit als Systemadmin das Studium an. Viele der genannten Themen - wie Double Buffering, selbstprogrammierte/-optimierte Suchalgorithmen, usw. - sind mir bereits Begriffe. Beruflich möchte ich später kein (reiner) Programmierer sein - das soll weiterhin nur ein kleiner Bereich bleiben.
Ich bündle nur gerne zeitweise immermal meine Freizeit in ein Thema. Da gab es schon Mikrocontrollertechnik, Browsergameentwicklung und vieles weitere. Java bzw. Android-Apps waren in der Vergangenheit auch mal ein Thema, hier ging es jedoch aus Zeit- und Motivationsgründen nur bis zu einem kleinen Jump&Run.

Die Logik im Spiel (GameLoop, Movement, ...) ist mir relativ klar. Doch wie setze ich als unerfahrener Entwickler nun eben optimalerweise Double Buffering, Kollisionserkennung, Synchronisation im Mehrspielermodus, ... um?
Hier hätte ich gerne irgendetwas an der Hand, das mich bei diesen Fragen mit API, Doku, Codeschnipseln und Beispielen unterstützt. Habe mir bereits Literatur und einige Videos angesehen, aber jeder packt das natürlich etwas anders an. Für mich als Laien in dem Bereich ist es dann immer schwer zu bestimmen welchen Weg ich einschläge. Das fäng eben schon bei der Programmiersprache und eingesetzten Engine an und zieht sich dann weiter.
Evtl. könnt ihr ein Tutorial empfehlen in dem etwas ähnliches (2D, RPG wäre natürlich super, mit wirklich guter/professioneller Umsetzung und Doku) gezeigt wird, dann kann ich mich daran etwas halten.
 
Die Logik im Spiel (GameLoop, Movement, ...) ist mir relativ klar. Doch wie setze ich als unerfahrener Entwickler nun eben optimalerweise Double Buffering, Kollisionserkennung, Synchronisation im Mehrspielermodus, ... um?
Den Ansatz hast du ja schon genannt, du besorgst dir irgendeine Bibliothek, die dir da die plattformabhängige Arbeit abnimmt. Spontan fällt mir da allerdings nur SDL ein, wofür es auch Netzwerk-Erweiterungen und sowas gibt, aber dafür gibt es IIRC keine Java-Bindings.

C# auf Android wäre mir neu, immerhin kommt das von Microsoft.

Kollisionserkennung? Selber machen. Ist bei einfachen geometrischen Figuren wie Kreisen und Polygonen nicht unbedingt schwer, v.a. wenn es im 2D-Raum stattfindet - vielleicht das alte Mathebuch wieder herauskramen und/oder Google befragen.

Synchronisation im Mehrspielermodus? Allgemein Mehrspielermodus? Nun, da wird man wahrscheinlich nicht viel finden, was einem da alles vorkaut. Netzwerk-Grundlagen sollte man kennen und sich mit Socket-Programmierung auseinandersetzen - wenn man sich auf TCP beschränkt, ist auch das an sich nicht sonderlich schwer.

Aber am besten gehst du sowieso erstmal Schritt für Schritt an die sache heran - irgendwie zusehen, dass du etwas auf den Bildschirm bekommst, dass du irgendwie auf Eingaben reagierst und vielleicht als Erstes irgendetwas popeliges wie Tic Tac Toe baust, um mit den Werkzeugen vertraut zu werden. Bau dir irgendwie eine Spielewiese, um neue Sachen auszuprobieren.
 
te one schrieb:
...Doch wie setze ich als unerfahrener Entwickler nun eben optimalerweise Double Buffering, Kollisionserkennung, Synchronisation

Das kommt mit dem Info Studium nach und nach in verschiedenen Modulen zusammen.

Double Buffer: lernst in Computergrafik
Kollisionserkennung: Lineare Algebra (Richtungsvektoren, Positionen..) und Graphentheorie
Synchronisation: Verteilte Systeme (zwischen Rechnern) oder in Betriebssysteme (zwischen Prozessen/Threads)

Jeder Teil davon ist praktisch ein eigenes, großes Thema. Deswegen spezialisiert man sich im Studium auch später wenn man die Wahlmodule bekommt. Obigen Angaben nach einem FH Studium Angewandte Informatik. Reine Allgemein-Informatiker bzw Uni Bachelor machen eher theoretische Sachen, daher kann ich für nix garantieren was diese Studiengänge angeht.
 
Zuletzt bearbeitet von einem Moderator:
Okay dann bleibe ich jetzt erstmal bei libgdx und sehe mal was sich damit machen lässt.

Eine Frage noch zum Multiplayer (kann es garnicht erwarten das anzugehen): Gemäß dem Skript, dass ich hier habe (eine etwas veraltete Arbeit eines Studenten), ist die Echtzeit-Darstellung im Mehrspielermodus garnicht so einfach. In seinem Projekt wurde "Dead Reckoning" vorgestellt und mit mäßigen Erfolg auch verwendet. Bei meiner Umsetzung würde ich hier bei jeder Änderung eines Clients bzw. spätestens nach 15-30 Sekunden ein TCP-Paket mit aktueller Position, Richtungsangabe (4 Himmelsrichtungen + 4 Diagonalen) und Geschwindigkeit nutzen, anhand dessen der andere Client dann die Bewegung selbst berechnet. Ist das so Stand der Technik in diesem Bereich oder gibt es (für den Anwendungsfall des 2D RPGs) eine passendere Alternative?
 
Ja, mach einfach nach Intuition und versuch gar nicht erst etwas im vorhinein perfekt zu machen ;)
Solche Konzepte werden in der Softwareentwicklung immer öfter verworfen und durch agile Vorgehensweisen ersetzt.

Fragen und Probleme laufen dir schon mitten drin über den Weg, dann kannst eins nach dem Anderen zusammensuchen.

Ohne Server wäre so etwas recht naheliegend, nur sind 15-30 Sekunden viel zu lang :D
Wenn du Online MMOs spielst, dann siehst auch öfter bei Lag wie die Charaktere weiterlaufen und dann auf einmal zurück teleportieren, oder immer die vorherige Animation weiter ausführen...

So macht es WoW & Co. Final Fantasy ist Server basiert, der Effekt hier ist dass man bei schlechtem Ping aus Feuer läuft, aber außerhalb des Feuerbereichs doch getroffen wird weil die Verzögerung Client<->Server zu hoch ist. Ersteres ist performanter und flüssiger, aber Cheat anfällig (Teleport Hack!). Letzteres ist sicherer aber der Spaß hängt extrem von der Verbindungsqualität ab, wird also kaum benutzt.
 
Zuletzt bearbeitet von einem Moderator:
Bei WoW erfolgt die Kommunikation von Client zu Client? Gibts deren Konzept irgendwo zum nachlesen?
Dachte schon an eine Art Observer-Technik: Der Server informiert den Client, welche Spieler von seinen Events wissen müssen (weil z. B. in Sichtweite) woraufhin der Client dann bei zukünftigen Events alle diese Spieler direkt benachrichtigt.

Ist sowieso noch viel zu früh für dieses Thema. Mache mir nur gerne Gedanken darüber wie man das optimal lösen könnte.
 
Das Thema Netcode ist sicherlich beliebig kompliziert wenn du auch mit Ping-Peaks >100ms brauchbar klarkommen willst.
Sicherlich hast du selber online-multiplayer Erfahrung? In WOW gabs das Phänomen das leute beim disconnect einfach immer weiter liefen, oder? Das deutet auf diesen Ansatz hin:
http://www.gabrielgambetta.com/fpm2.html
https://developer.valvesoftware.com...rver_In-game_Protocol_Design_and_Optimization
Beim HalfLife1 wurde es mal geändert soweit ich mich erinner. Der neue Effekt war dann, dass man sich selbst zB in Deckung duckt und denkt man wäre sicher und evtl 200ms später erfährt dass ein anderer Spieler einen doch noch treffen konnte und dann "nachträglich" gestorben ist. Der Vorteil war aber, dass man Ping-Unabhängig direkt auf Spieler zielen durfte als Sniper (TFC..) und den Treffer auch bekommen hat, wenns auf dem eigenen Client so dargestellt wurde.
Im Gegensatz dazu könntest du dir auch überlegen wie es bei Quake3 gemacht wurde. Da war der Ansatz anders was dazu geführt hat, dass man "Vor" die Gegner zielen musste um zu schätzen wo sie mitlerweile hingelaufen sind. Dh bei geringem Ping konnte man direkt auf die Figur zielen aber mit steigendem Ping musste man immer weiter vor die Laufrichtungzielen. Das war halt bei HalfLife1 anders durch diesen nachträglichen Korrektur-Ansatz.
Ich hatte zu diesem Korrektur-Ansatz mal ein sehr cooles Video irgendwo gesehen was den brauchbar mit Code-Beispielen erklärt aber konnte es jetzt leider nicht auf die schnelle bei youtube finden :/
 
Zuletzt bearbeitet:
In jedem Fall hängt die Netcodestrategie sehr stark vom Spiel ab und hier gibt es wohl nicht ein und die selbe Lösung zweimal. Die Anforderungen eines MMORPGS mit tausenden Spielern aber "trägem Kampfsystem" sind ja komplett anders als bei einem Shooter mit 10 Spielern aber möglichst 0ms Ping.
 
NetCode ist einfach eine never Ending Lovestory, wir hatten bei einem 2D Spiel (ähnlich zu Terraria) so erhebliche Probleme, das alle MP Clients eine Dia Show darstellten. Das ganze ging dann immer besser, bei recht schnellen Spielen ist es aber doch schon enorm, wieviele Pakete gesendet werden und empfangen!
 
Naja, optimal gibt es halt nicht. Es gibt immer nur relativ optimal, also das was für dein Programm am besten ist. Würde vorschlagen du legst einfach los, wenn etwas falsch läuft lernst du mehr als mit direktem Erfolg :)
Am Ende wirst du wissen wann etwas zu benutzen ist.

Das wichtigste ist dass du den Code möglichst Objektorientiert hälst, so dass du gewisse Teile später sehr einfach austauschen kannst.

Für den Anfang könntest du halt ein Spiel machen wo du gegen einen PC spielst, die Kommunkikation aber verteilt erfolgt. Wäre beim Testen sicherlich einfacher als wenn du immer zwei Clients bedienen musst :D
 
Zuletzt bearbeitet von einem Moderator:
rob- schrieb:
Das wichtigste ist dass du den Code möglichst Objektorientiert hälst, so dass du gewisse Teile später sehr einfach austauschen kannst.

Für den Anfang könntest du halt ein Spiel machen wo du gegen einen PC spielst, die Kommunkikation aber verteilt erfolgt. Wäre beim Testen sicherlich einfacher als wenn du immer zwei Clients bedienen musst :D

Um einzusteigen ist das genau der falsche Ansatz wie ich finde und das sag ich aus eigener Erfahrung mit mehr als 20 Jahren Programmiererfahrung! Warum? Was hat man davon wenn man 50 Fancy Klassen mit 30 Interfaces und nicht zu vergessen den beliebten *Impl´s erstellt um später wieder alles wegzuwerfen, weil man merkt es funktioniert nicht oder passt einfach nicht zusammen.
Das ist dann der typische Versuch "Ich schreib jetzt ne Engine... Spiel kommt dann danach".

Warum nen TextureManager machen wenn man nur 3 Texturen im gesamten Spiel hat, oder warum nen ECS wenn man nur 2 Entitytypen hat? Wozu Deferred Rendering wenn man nur 2 Lichtquellen braucht usw. Liste geht endlos.

Besser ist hier: Den Spiel Prototypen entwickeln und dabei nach dem "Usagecode First"-Prinzip vorzugehen. Das bedeutet: Nur das implementieren was man auch wirklich braucht - der Code leitet einen wann es Zeit wird Teile in Klassen auszulagern.

Versuch nicht das Monster MMORPG von jetzt auf nachher zu schreiben, sondern lass überhaupt mal nen Player über den Bildschirm wandern. Danach kannst du weitermachen und nen Testlevel rendern, von mir aus Tilebasiert und implementierst einfache Kollisionserkennung und Kollisionslösung. Dann bau nen NPC ein und gib deinem Player ne Möglichkeit anzugreifen und und und.

Dann kannst du das versuchen auf ne UDP/TCP Server/Client umzubauen, aber selbst das würde ich viel viel später machen.
 
Meiner Erfahrung nach sind solche Projekte die teuersten schlecht hin wenn man keine geordnete Struktur hat. Wenn es dann nicht passt hat man einfach nicht richtig nachgedacht bzw. der Projektmanager ist untauglich.

Lieber mal alles kurz durchdenken anstatt beim nächsten Update das Game halb neu coden zu müssen, weil der Code aus Klasse A irgendwie mit Code aus Klassen B,C,D und F verwustelt ist. Muss ja kein Wasserfall Modell sein, reicht ja schon grob zu wissen wie man etwas strukturiert und ein System dahinter hat, damit zukünftige Erweiterungen nach diesem System arbeiten.

Man muss ja nicht übertreiben, aber eine Klasse die die Kommunikation regelt ohne zu wissen was übertragen wird ist halt vorteilhaft und wiederverwendbar. Die Daten selbst müssen eh beim Sender/Empfänger verarbeitet werden, dazu muss die Kommunkationsklasse nichts wissen und auch nicht angepasst werden. Wer da beim Sender und Empfänger die Kommunikation einbaut, der hat zehnfache Arbeit und kommt nicht zum eigentlichen Kern voran.

Das gilt auch beim agilen programmieren - und genau bei solchen Dingen unterscheiden sich gute Programmierer (die alles im Blick haben) von den schlechten, die auf gut Glück irgendwie den Code zusammenläppern, ohne zu wissen was sie dann beim nächsten Update tun müssen.

Tja, leider ist man auch nicht auf der sicheren Seite wenn jemand Informatik studiert hat. Da wird zu viel Murks mit 1.0 durchgewunken, so dass selbst zwischen zwei 1.0er noch extreme Unterschiede zu finden sind. Habe schon Leute mit 3.0 gesehen die deutlich besser waren als die 1.0er beim Prof. X
 
Zuletzt bearbeitet von einem Moderator:
Ich geb rob hier vollkommen recht, natürlich kam undurchdachter Code besser sein , oftmals steckt im dahin geschrieben Code mehr herzblut und Ideen. Aber gerade ein Projekt zu planen ist etwas sehr wichtiges & fürs arbeite Leben relevantes. Würde gerne mal einen Kunden sehen der zu dir sagt "Machs wie du willst & die Zeit ist egal"..
 
Mal ganz gepflegt auf die Schnauze fliegen wird ohnehin jeder mal - und sei es nur, weil sich eine Anforderung geändert hat und der existierende Code nicht dazu passt. Das kann man auch vorher nicht planen, wenn man nicht schon Erfahrung in dem entsprechenden Gebiet gesammelt hat.

Ich glaube jedenfalls nicht, dass man von einem "unerfahrenen Entwickler" verlangen kann, dass er mal eben Dinge im Voraus plant, von denen er noch nicht einmal konkret weiß, wie sie funktionieren - Experimentieren ist da angesagt, dann kann man immer noch schauen, wie die finale Umsetzung aussehen wird.
 
Zurück
Oben