Graphics2D für Spiele?

Hallo leute, ich wollte fragen, ob Graphics2D für Spiele gut geeignet ist.

Die Frage sollte her lauten “Ist Swing/AWT für Spiele gut geeignet?”, da Graphics2D ja bloß eine Klasse aus dem Framework ist.
Was soll das denn für nen Spiel werden? Nen TicTacToe, Memory oder Minesweeper kann man damit sicherlich gut realisieren, Crysis 4 eher nicht.

im Vergleich zu was?
für Spiele ohne Grafik kaum benötigt, für Spiele mit 3D kaum ausreichend,

für Spiele mit 2D-Grafik ok, in der Java-API auch keine Alternativen

für jede halbwegs respektierte unabhängig entwickelte Library irgendwo in der Welt gilt immer dasselbe, auch für Spielegrafik:

  • im Allgemeinen besser als spröde Java-API, modernerer Code, Praxis mit eingedacht und fortentwickelt, Komfort
  • wofür genau gedacht, wofür besonders geeignet wird sicherlich jeweils beschrieben sein
  • Nachteil: kleinerer Expertenkreis, viele werden es nicht kennen, aus reiner Entscheidungsnotwendigkeit anderes bevorzugen

Ich denke wenn du gerade anfängst mit dem bereich spieleentwicklung, (und so klingt die frage), solltest du auf jeden fall versuchen
ein paar kleinere projekte oder auch nur teile von bestimmten ideen mit java2d umsetzen. einfach weil es einfach ist, und du nicht die größte
zeit damit verbringst, wirklich an der grafik zu arbeiten, sondern eher die ganzen techniken und vorgehensweisen aus diesem bereich lernst.
(Bei den meisten meiner allerersten projekte bestand der gesamte render code aus einer zeile, g2d.drawImage(…) :smiley: )

Es wird eigentlich für die meisten 2d sachen ausreichen, die du am anfang hinbekommst. sogar zB ein terraria abklatsch ist mit java2d kaum ein problem.

Spiele haben meist ganz andere Anforderungen als “normale” Oberflächen. Wenn es wirklich nicht nur ein einfaches “Vier Gewinnt” oder so werden soll, würde ich bei 2D zu Slick2Draten, und bei 3D zu JMonkeyEngine (scheint gerade down zu sein). Ja, man braucht etwas Einarbeitungszeit (wie auch bei Swing), nur stößt man dann nicht auf so schnell auf unüberwindliche Hindernisse, wenn man doch mal etwas Komplexeres braucht. Ich sehe keinen Grund, das Rad neu zu erfinden, wenn man das “rundum sorglos Paket” haben kann: Input, Sound, Partikel, HUD, Tiles (2D)/Terrain (3D), Kollisionserkennung u.s.w.

den gibt es aber, nämlich das Verstehen und selbstständige Anwenden aller Hintergrundprozesse.
Ich finde das ist ein wichtiger Schritt, den man neulingen nicht vorenthalten sollte.

*** Edit ***

Da ist es mehr als lohnenswert mal selbst zu versuchen, ein eigenes (copy und paste aus dem netzt bringt’s dann natürlich auch nicht…) input system mit swing
aufzubauen. man kann eigene techniken entwickeln, das ganze optimieren… da ist so viel arbeit die auch etwas bringt. funktionieren tut es aber auch schon mit wenig arbeit.

wieso nicht hingehen, und sich ein bisschen mit der java sound api rumschlagen? Sound braucht man nicht nur in spielen. Irgendwann kommt „hm, in dieser anwendung würde
ich gern da und da mal was abspielen“ - jemand der sound nur mit game api’s benutzt hat, wird ratlos vor dieser aufgabe stehen

wenn jemand keine ahnung hat, was partikel eigentlich sind, wie partikelsysteme funktionieren, und nie versucht selbst welche aufzubauen… was ist daran bitte gut?

ähnlich wie oben, nur ganze GUI inbegriffen.

naja mir fallen keine neuen worte ein, aber du würdest jemand auf diesem gebiet ernsthaft empfehlen, das alles NICHT zu lernen? ALso wie es im hintergrund funktioniert? dann weiß ich auch nicht…

erst recht in diesem umfangreichen thema. ich finde das ist ein MUSS, mit dem man sich low level mal beschäftigt haben MUSS, wenn man lernen will spiele zu entwickeln.


Ganz im Ernst, mit dem gleichen Argument hättest du gar kein Java lernen dürfen, bevor du nicht wenigstens einen Compiler in Assembler geschrieben hast. Zu einem Spiel gehört viel zu viel dazu, das kann man - selbst als Profi - nicht alles selbst machen. Sicher ist Verständnis wichtig, aber hier ist es einfach Overkill - vor allem, wenn am Ende irgend etwas herauskommen soll.

Man kann bei jedem einzelnen Punkt so weit in die Tiefe gehen, dass man sein ganzes Leben damit verbringen könnte, eine Engine/Lib für genau das zu schreiben. Die Frage war von vornherein zu breit und zu schwammig, als dass man viel mehr antworten könnte als “Schau mal über Killer Game Programming in Java drüber”…

Kann man open_gl selbst schreiben?

ja, wenn du c kannst…

gut ich steig hier aus. zustimmen tu ich dir trotzdem nicht.

[QUOTE=mymaksimus]ja, wenn du c kannst…

gut ich steig hier aus. zustimmen tu ich dir trotzdem nicht.[/QUOTE]

Das ist schade. Im Prinzip ist das die alte “wissen vs. wissen wo’s steht” Dabatte, und ich halte es mit dem alten Tucholsky: “Der Mensch sei kein Lexikon!”

Natürlich schadet es nicht zu wissen, wie man eine Perspektive berechnet oder eine Kollision erkennt. Aber das Problem, so etwas mit effiziente Datenstrukturen und Algorithmen mit einer guten, konsistenten API abzubilden, ist nicht trivial und kostet hunderte Mannstunden, die man besser in das Spiel investiert.

Nebenbei bemerkt zeigt sich die Schwäche deines Arguments bei Swing/Graphics2D selbst: Hast du schon mal den Bresenham-Algorithmus, affine Transformationen oder Blending-Modes selbst geschrieben? Nein? Warum ist es dann okay, den Code von Graphics2D zu verwenden?

Ist immer eine Frage der Verhältnismäßigkeit. Als mich das Thema Spieleentwicklung interessiert hat, wollte ich auch erst alles unbedingt selber machen. Da zu beginn auf Frameworks zu setzen, halte ich auch für besser. Ich finde es mittlerweile viel wichtiger, da erstmal Ergebnisorientiert zu arbeiten. Denn ohne Engine kann man sehr viel Zeit in so ein Spiel stecken [in meinem Fall hatte ich für ein fertiges Spiel (was über Game of Life rausging) aber nie genug Zeit und mittlerweile würde ich dafür Unity3D verwenden]. Wenn man Sachen wie Slick nutzt und weiß, wie man ein Spiel aufzieht - dann kann man immer noch Mechaniken hinterfragen und mal selber probieren nachzubauen (vllt in einem etwas vereinfachterem Kontext).

der Vergleich zu Java als Compiler oder auch Bresenham-Algorithmus ist unpassend,
je nach Interesse gibt es immer eine Ebene in der man beginnen möchte,

Java an sich mit Klassen, Objekte, Methoden, Polymorphie, primitive Datentypen, Ein- und Ausgabe,
einige Gimmicks in der API wie Math, BigDecimal, Listen, im Hintergrund Thread, Speichermanagement usw.
ist der perfekte Sandkasten um mit beliebiger Programmierung zu beginnen,

ein Taschenrechner, ein A*-Algorithmus, was immer man will


fürs Zeichnen allein reicht das nicht, falls nicht Konsolen-Schick reicht,
keine 100 einfache Befehle hintereinander bringen einem einer GUI näher,
das ist Hintergrundmagie, mit deren Programmierung man sich beschäftigen kann wie mit einem spröden Compiler, aber selten interessant ist

Swing-Fenster, paintComponent, oder auch Image-Objekt, Graphics2D, gegebenes Pixel-Koordinatensystem, einzelne Punkte zeichnen können,
das ist eine interessante Grundlage erreicht wie mit Definition einzelner Variablen und Schleifen,

zusätzliche fertige APIs sind nicht schlecht, aber auch gar nicht so wichtig,
wenn man zeichnen möchte, Schritt für Schritt, etwa nach dem anschaulichen, recht konkurrenzlos einzigen Tutorial hier
http://forum.byte-welt.net/java-forum-erste-hilfe-vom-java-welt-kompetenz-zentrum/spiele-und-multimedia-programmierung/5049-quaxlis-spiele-tutorial.html
dann hat man eine ideale Möglichkeit, das ist Java2D schon gut anzurechnen,

wobei das in anderen APIs sicher genauso geht,

gerade grob gefunden, nicht ganz bedenkenlos (gleich komplizierte Bilder), aber führt gewiss auch zum Ziel

wie auch immer es zu der Diskussion kam, es ist ganz unnötig darüber zu streiten,
einzelne Pixel & Co. zu malen ist ein sinnvolles Lern-Vorgehen, genauso wie einzelne boolean-Variablen, mit allen Ausbaustufen,
und trotzdem kann man letztlich für ernstes Vorgehen andere APIs verwenden, nicht immer (bzw. nur einmal unter Millionen) wird ein Simon™ draus :wink:

Auch so eine Diskussion mit Bart:

**
A) Soll man erst mal versuchen, alles von Hand, bei 0 anfangend, total von vorne mal mit Bordmitteln selbst zu machen?
**
Vorteil: Man lernt dabei, welche Probleme es gibt, wo die Schwierigkeiten sind, WAS GENAU die Bibliotheken/Frameworks einem später mal abnehmen werden

Nachteil: Das dauert

**
B) Oder soll man gleich zur Bibliothek/Framework greifen und lernen, dieses richtig gut zu verwenden
**
Vorteil: Man nähert sich eher seinem Ziel, und das Gelernte hilft später auch noch weiter

Nachteil: Unter Umständen versteht man nicht so richtig was ganz „tief“ unten vorgeht.

Meiner Meinung nach ist das keine Frage: gut, so ein zwei Nachmittage lang kann man ja versuchen, multi-threaded Collections implentieren / 2D Spiele entwickeln / einen String-Template Mechanismus entwerfen / …(und sei es nur um zu lernen, wie es nicht geht). Aber mehr Zeit dafür aufwenden? Witzlos.

Würde ich auch sagen dass DIE MOTIVATION eben durch sichtbare Ergebnisse nicht ganz so katastrophal den Bach runter geht wie bei anderen Zugängen.

Dito. Und um solche Themen für sich mal näher zu untersuchen brauchts auch kein Projekt - welches diese Dinge unbedingt nutzt. Das kann man ja als Codesnippet halten. Für so Zeugs gibts bei mir eigentlich immer ein Extra-Projekt wo ich einfach mal Sachen ausprobiere oder versuche nachzubauen.

Moin,

imho ist die Frage was man will. Zwischen Mode 13h und einem fertigen Spiel aus dem Laden liegen unendlich viele Abstufungen. Auf alle passt das schwammige “für Spiele gut geeignet”. Jeder muss eben seine Ebene finden.

Mich würde z.B. eine fertige Engine nicht die Bohne interessieren.

Gruß
Fancy

Ich bin wieder neu in Java eingestiegen und habe gleich von Anfang an JavaFX für meine Gameloop genutzt. Der AnimationTimer hat eine Methode namens handle, die in jeder 1/60 Sekunde aufgerufen wird und gleich noch einen Timestamp mit übergeben bekommt. Ich arbeite nur mit einem eigenem RGB-Buffer und zeichne wirklich alles Pixel per Pixel komplett selbst, da ich ein paar Grundlagen zur Grafikprogrammierung so lernen will. Aber was ich bei JavaFX an Möglichkeiten gesehen habe, ist wirklich beachtlich, das wird auch noch alles in der Regel automatisch von der Grafikkarte beschleunigt. Also ich kann mir gut vorstellen, dass allein mit JavaFX schon schöne 2D-Spiele möglich sind, ohne dass es gleich mit der Performance kritisch wird.

handle(long now) wird einmal pro Frame Aufgerufen.

The class AnimationTimer allows to create a timer, that is called in each frame while it is active.

MFG Melfis