# Probleme mit Darstellung von Umgebungen mittels mehrdimensionaler Arrays



## Arn (15. Aug 2014)

Guten tag,

Ich bin gerade dabei ein Spiel zu entwickeln und habe mir gedacht das ich am besten für die Darstellung des Levels einen Mehrdimensionales (3 dimensionales) Array benutze. Hier drin sind Objekte gespeichert. Die Darstellung funktioniert bei mir so, dass ich eine Hauptklasse habe, die von JPanel erbt und einen JFrame hat, in dem sie sich selbst befindet. Nach dem Konstruktor wird eine Endlosschleife ausgelöst, es handelt sich dabei um eine while schleife, die als Ausgangsbedingung die Methode isVisible() von JFrame hat. In ihr werden nun die repaint() Methode ausgeführt, und der Thread anschließend für 30 Millisekunden schlafen gelegt. In der paintcomponent Methode meines JPanels steht dann alles  was angezeigt werden soll. Unter anderem wird auch meine Map gezeichnet. Dies geschieht indem das mehrdimensionale Array mit 3 ineinander verschachtelten for- schleifen abgegrast wird. Die Klassen die sich in dem Array befinden haben alle eine Methode paint(Graphics g) die hier ausgeführt wird.

Soweit so gut, nun aber zu dem Problem.

DasArray wird nicht bei jedem Schleifendurchlauf vollständig gezeichnet, dies äußert sich darin, das die Karte oder teile der selbigen manchmal flackern. Ich weiß nicht woher das kommt, ich habe mit die Zählvariabeln der for-Schleifen ausgeben lassen, und diese sagen, das auch in den fällen wo das Bild flackert, das komplette Array abgegrast und überall die Paint Methode ausgeführt wurde. Es gibt keine Exceptions, und Code der nach dem Zeichnen der Map in paintComponent(Graphics g) steht wird auch problemlos ausgeführt. Ich weis nicht wo das problem liegt, gibt es noch andere Threads die auf meinen Array zugreifen von denen ich nichts weis?

Vielen Dank für alle Antworten


----------



## HarleyDavidson (15. Aug 2014)

Das Problem hatte ich auch.

Ich empfehle dir diese Seite: Java 2D games tutorial

Und bei deinem Problem speziell dieses Kapitel: Java games animation

Hier werden die verschiedenen Arten von Animation vorgestellt. Wenn du den Artikel liest, wirst du gleich herausfinden, welche Animationsart bei dir am geeignetsten ist.


----------



## turtle (15. Aug 2014)

Das ständige Neuzeichnen des JPanels führt (natürlich) zu Flackereffekten

Ausserdem synchronisiert Swing nicht das Drawing deines Programms mit dem Neuzeichnen des Bildschirms.

 Daher werden derartige Dinge oft in einem off-screen Modus gezeichnet und am Ende die ganze Bitmap "gezeichnet". Dieses nennt sich Double-Buffering und verhindert dadurch, das Teile gezeichnet werden, die im nächsten Durchlauf _etwas _anders aussehen.

Du kannst einBufferedImage erzeugen und deine Ausgabe darin machen.

```
BufferedImage displayImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = displayImage.createGraphics();
```
Dieses displayImage "malst" du dann einfach in deinem paintComponent, bzw. lässt Swing dies tun, indem du repaint() aufrufst.


----------



## Arn (15. Aug 2014)

@ HarleyDavidson mein problem hat nichts mit einer Animation zu tun, trotzdem Danke, ich werde mir das Tutorial mal zur Gemüte führen. 
@ turtle danke ich werd mal sehen und wahrscheinlich einen hybrid zwischen der jetzt bestehenden und der offscreen Technik entwickeln, ich vermute nämlich das ich den Arbeitsspeicher zu sehr quäle  wenn ich bei größeren maps alles vorzeichne aber ich denke das sich da was hübsch dynamisches machen lässt. Vielen Dank!


----------



## kaoZ (30. Aug 2014)

> ich vermute nämlich das ich den Arbeitsspeicher zu sehr quäle wenn ich bei größeren maps alles vorzeichne



deshalb zeichnest du im normalfall auch immer nur die Tiles ( + 1 oder 2) die im sichtbaren Bereich liegen


----------



## wolfi1337 (2. Sep 2014)

ich habe ähnliches mit dem GUI Builder von netbeans gebaut, was problemlos ging - vielleicht versuchst du es mal damit.


----------



## kaoZ (2. Sep 2014)

> ich habe ähnliches mit dem GUI Builder von netbeans gebaut, was problemlos ging - vielleicht versuchst du es mal damit.



was hat das mit der Darstellung einer TileMap in Form eines Mehrdimensionalen Arrays zu tun ?


----------



## Androbin (17. Sep 2014)

Arn hat gesagt.:
			
		

> Nach dem Konstruktor wird eine Endlosschleife ausgelöst, es handelt sich dabei um eine while schleife, die ...


Frage: Läuft deine Endlosschleife direkt innerhalb des Konstruktors oder startest du hierfür einen neuen Thread?


----------



## Androbin (5. Okt 2014)

Androbin hat gesagt.:


> Frage: Läuft deine Endlosschleife direkt innerhalb des Konstruktors oder startest du hierfür einen neuen Thread?



Im ersten Fall wird der Konstruktor nie abgeschlossen,
==> vielleicht liegt da das Problem ...

°°° PS. BITTE MELDE DICH AUCH MAL ZURÜCK °°°


----------

