# Aufruf einer render-Methode



## Roovy (16. Nov 2016)

Ich habe ein Interface "GameState" erstellt, von dem jeder State erbt und diese Methode erhält:

```
public void render(Graphics g) { }
```
Nun habe ich auch eine Klasse "GameStateManager". Diese Klasse enthält verschiedene Methoden zum hinzufügen von GameStates und ändern des States. Unter anderem auch eine Methode die 
	
	
	
	





```
public void render(Graphics g)
```
 des aktuellen GameStates ausführt. Diese Funktion soll jetzt aus einer zweiten Klasse "GameLoopMaster" genutzt werden. GLM enthält eine Methode 'start()', die dann in einem while-Loop die 'renderCurrentState(Graphics g)'-Methode des GameStateManagers aufrufen soll.
Nun kann ich es aber einfach nicht zum laufen kriegen! Was genau muss ich im GameLoopMaster jetzt als Argument der Methode vom GSM übergeben?


----------



## Sogomn (16. Nov 2016)

Na das Graphics-Objekt, mit dem Du zeichnen willst.


----------



## Roovy (17. Nov 2016)

Ja, aber wie initialisiere ich dieses? Ich kann mir keinen Reim darauf machen. Ich müsste ja eigentlich nur in meiner GameLoopMaster-Klasse eine Graphics-Obhekt erstellen und übergeben. Aber genau da liegt mehr oder weniger das Problem. Tut mir leid, sollte das nicht aus meiner ersten Aussage hervor gegangen sein.


----------



## Sogomn (17. Nov 2016)

Naja, zeichnen kann man in der Regel nur auf irgendeiner Oberfläche (einem Bild oder Fenster). Die Klasse "Component" (oder "JComponent") hat z.B. die Methode "getGraphics()", die dir das entsprechende Graphics-Objekt gibt.


----------



## Roovy (18. Nov 2016)

Okay. Vielen Dank. Ich müsste also vorher ein JFrame mit einem JPanel darin erstellen.


----------



## Sogomn (18. Nov 2016)

Musst Du nicht zwingend. Du kannst auch, ohne auf dem Bildschirm anzeigen zu lassen, auf ein Bild zeichnen.


```
final BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
final Graphics2D g = image.createGraphics();
```


----------



## Roovy (23. Nov 2016)

Ist das die Methode (in Grundzügen) mit der man auch Double-Buffering realisiert?


----------



## Sogomn (24. Nov 2016)

Double-Buffering hängt von der Oberfläche, auf der Du zeichnest, ab. So weit ich weiß, unterstützt z.B. die Klasse JPanel es nicht explizit.
Ich benutze weiterhin die Klasse Canvas aus dem AWT-Package (ja, hasst mich alle dafür).


```
final Canvas canvas = new Canvas();

myFrame.setVios//Fenster mit Canvas sichtbar machen, bevor die Buffer erstellt werden!

canvas.createBufferStrategy(2); //1 Extrabuffer reicht

//...

final BufferStrategy bufferStrategy = canvas.getBufferStrategy();

do {
    final Graphics2D g = (Graphics2D)bufferStrategy.getDrawGraphics(); //Kann man sicher casten

    //...

    g.dispose();
    bufferStrategy.show(); //Front- und Backbuffer tauschen
} while (bufferStrategy.contentsLost()); //Es kann passieren, dass der Buffer irgendwie verloren geht, daher die Schleife
```

In der Dokumentation wird das ganze sogar in zwei Schleifen gepackt, da es auch sein kann, dass der Inhalt des Buffers zurückgesetzt wird ("BufferStrategy#contentsRestored()").
Hier genaueres.


----------



## Roovy (25. Nov 2016)

Mit den beigepackten Javadocs habe ich es hingekriegt. Versuche ich es aber als ein Loop (wie bei dir) zu realisieren zeichnet es bei mir nicht mehr?! Bzw ist es nötig diese zwei Loops zu machen, die durchlaufen, wenn contentsRestored und contentsLost zutrifft?


----------



## Roovy (25. Nov 2016)

Nevermind. Ich habe es hingekriegt. Aber immernoch: Ist es nötig diese zwei inneren Schleifen zu haben?


----------



## Sogomn (25. Nov 2016)

Soweit ich das verstanden habe, gibt contentsRestored() nur true zurück, wenn sich die Zeichenfläche irgendwie neu initialisiert hat (also irgendein Kram mit dem Canvas gemacht wird?).
Und falls das doch mal vorkommen sollte - es ist nur ein verlorenes Frame; bei konstantem Neuzeichnen fällt das nicht weiter auf.


----------



## Roovy (26. Nov 2016)

Ich habe noch eine Frage hinsichtlich des Renderns: Das Grafikobjekt malt ja (von den Koordinaten ausgehend) auch unter der Windows Toolbar und den Rändern des Fensters. Kann man etwus tun, um das nicht kompensieren zu müssen?


----------



## Sogomn (27. Nov 2016)

Du meinst, dass nicht sichtbare Dinge einfach nicht gezeichnet werden? Leider nicht. Das musst Du manuell prüfen.


----------

