# ressourcensparendes Anlegen von Images



## fk1988 (4. Feb 2012)

Ich programmiere gerade ein einfaches Jump n Run Spiel.
Ziel des Spiels ist es, als Spieler gewisse Hindernise zu überwinden. Hindernise können Steine, Kisten usw sein.

Mein Klassendiagramm sieht also wie folgt aus:







in der Klasse Spielanzeige lege ich alle Spielobjekte an.
d.h.
1x Spieler, 20x Stein, 120x Kiste.

Das Spiel wurde so konzipiert, dass ein neues Hindernis relativ schnell implementiert wird.
Soll heißen in der Klasse Stein wird mittels Konstruktor eine Position übergeben. In der Basisklasse Hindernis wird die paint() Methode aufgerufen.


```
public SpielObjekt(Spielanzeige spielAnzeige, String Filename, int x, int y)
{
	this.spielAnzeige = spielAnzeige;

	java.net.URL imageFilename = getClass().getResource(Filename);
	try
	  imageGameObject = getToolkit().getImage(imageFilename);
	catch (Exception e)
	  System.err.println(e.getMessage());

	if (imageGameObject == null)
	  System.err.println("cant find image");

	pointPos = new Point(x, y);
}

@Override
public void paintComponent(Graphics g)
{
  g.drawImage(imageSpielObjekt, x, y, spielAnzeige);
}
```



```
public Kiste(Spielanzeige spielAnzeige, int x, int y)
{
	super(spielAnzeige, "kiste.png", x, y);
}
```



Ich lege also für jedes Kiste-Objekt ein Image "kiste.png" an. Wäre es nicht Ressourcenschonender wenn man in der Klasse SpielObjekt jede Grafik nur einmal anlegt und diese im Konstruktor übergibt?

Wenn ich bei meiner Variante 120 Kisten anlege, habe ich auch 120 mal die gleiche Grafik im Speicher. Das ist doch nicht sinnvoll oder ist mir ein Denkfehler unterlaufen. Bitte klärt mich auf.

PS. Wie überprüft man ob ein Image richtig angelegt wurde? Auch wenn die Grafik "kiste.png" nicht existiert, ist mein image!=null. Ich habe gesehen die Width und Height sind -1. Sollte man ein Image immer mit getWidth()>-1 prüfen?


----------



## Fu3L (4. Feb 2012)

1) Gewöhne dir unbedingt an, die geschweiften Klammern auch bei Einzeilern zu setzen! Solche Konventionen sind wirklich sinnvoll.

2) Ja, du solltest eine Klasse anlegen, die für dich die Bilder verwaltet. Die lädt das Bild bei Bedarf (oder Start des Spiels) einmal und speichert es zB unter seinem Namen in einer Map. Wenn dann ein Objekt dieses Bild anfordert, erhält es nur die Referenz darauf und so nutzen alle das gleiche Bild.

Edit: Ich erhalte immer null bei meiner Art Bilder zu laden per ImageIO.read(location);


----------



## fk1988 (4. Feb 2012)

Fu3L hat gesagt.:


> 1) Gewöhne dir unbedingt an, die geschweiften Klammern auch bei Einzeilern zu setzen! Solche Konventionen sind wirklich sinnvoll.
> 
> 2) Ja, du solltest eine Klasse anlegen, die für dich die Bilder verwaltet. Die lädt das Bild bei Bedarf (oder Start des Spiels) einmal und speichert es zB unter seinem Namen in einer Map. Wenn dann ein Objekt dieses Bild anfordert, erhält es nur die Referenz darauf und so nutzen alle das gleiche Bild.
> 
> Edit: Ich erhalte immer null bei meiner Art Bilder zu laden per ImageIO.read(location);



1) ich hab die Klammern nur deshalb entfernt, weil ich nur so wenig Code wie möglich posten wollte.

2) wie sieht so eine Map (bzw. die Klasse) aus, habe im Netz und im Forum nichts dazu gefunden


----------



## Fu3L (4. Feb 2012)

Da reicht schon ein Blick in dein Java Buch  (oder online Java Buch wie "Java ist auch eine Insel").

Stichwort java.util.Map bzw java.util.HashMap. Ich möchte das jetzt nicht von Grund auf erklären. Die Collectionsklassen aus java.util sollte jeder Java-programmierer kennen, es lohnt sich also, da etwas tiefer einzusteigen


----------

