# Spiel rendern



## TheFabilicious (9. Aug 2015)

Hey Leute,

ich programmiere zur Zeit ein kleines Spiel. Klein ist relativ - es soll deutlich komplexer und größer werden.

So langsam habe ich jedoch ein Problem mit dem Rendern. Eigentlich ist es kein Problem, es ist bei mir nur wahrscheinlich unfassbar blöd gelöst.

Bei mir hat jede Kreatur, jeder Fortschrittsbalken, etc. (eben alle Objekte, die sichtbar sind) ein BufferedImage. Jedes mal, wenn z.B. von einem Fortschrittsbalken die Methode "render" aufgerufen wird, zeichnet der Fortschrittsbalken das BufferedImage neu (nach aktuellen Werten eben).

In der Klasse Gameplay werden dann sozusagen alle dieser Bilder der Objekte zusammengetragen und auf das JFrame gebracht.

Ist das aus programmtechnischer Sicht nicht eine totale Katastrophe es so gelöst zu haben?

Vor allem sieht die Klasse Gameplay natürlich dadurch total wild und durcheinander aus. Kann nicht irgendwie jedes Objekt selbst dafür sorgen - natürlich so Ressourcensparend wie möglich - gezeichnet zu werden?
Naja, eigentlich ist die frage nicht ob, sondern wie? 

Ich hoffe mir kann da jemand weiterhelfen. ​


----------



## TheFabilicious (9. Aug 2015)

Ich erweiterte mal eben meine Fragestellung. 

Geht es, dass ich in der Hauptklasse des Spiels ein statisches Objekt der Klasse Canvas erzeuge und, dass alle anderen Objekte dann darauf zeichnen? Diese Canvas wird natürlich an ein JFrame geklebt.

Also klar geht das, das weiß ich. Eigentlich. Nur dann gibt es doch sicherlich Probleme, wenn mehrere Threads gleichzeitig zeichnen wollen oder gerade die Hauptklasse die Leinwand löscht, während ein anderer Thread zeichnen möchte oder?

Oder sollte ich mir diese Canvas-Idee ganz aus dem Kopf schlagen?


----------



## brunothg (9. Aug 2015)

Guter Ansatz hierfür ist DoubleBuffering. Du zeichnest alles auf ein offscreen Image (BufferedImage) und nur das dann einmal in einem Rutsch auf dein Canvas.

Kannst auch einmal schauen, es gibt von Java aus auf manchen Systemen (bei Windoof z.B.) die Möglichkeit direkt Pageflipping zu nutzen. Also auf der Hardware die Speicherbereiche mit Zeigern zu ändern. Das ist sehr fix.

Mit Threads musst du natürlich aufpassen. Vor allem, was Vordergrund und Hintergrund angeht. Ansonsten übermalst du nachher deinen Vordergrund.

Am einfachsten und einigermaßen performant wird es, wenn jede Klasse, die zeichnet eine Methode zeichne dich bekommt(mit Graphics2D) und diese dann mit dem offscreen Image aufgerufen wird.

Wenn du aber etwas großes vom Zaun brechen willst schau dir OpenGL (z.B. LWJGL an). Das läuft dann auch mit statischen Zugriffen 

Wenn du dir eine Umsetzung des ganzen im kleinen Maßstab ansehen willst, ich habe das auch mal gemacht und arbeite gerade an der großen Version mit OpenGL. Aber Graphics2D läuft ganz solide. 
Unter https://github.com/brunothg nach Repository suchen und dort findet sich zum einen das GameEngine Projekt und zumindest JellySplush als Spiel, das die engine nutzt.


----------

