ressourcensparendes Anlegen von Images

fk1988

Mitglied
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:

bb20ebbd93.png


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.

Java:
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);
}


Java:
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?
 
Zuletzt bearbeitet:

Fu3L

Top Contributor
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

Mitglied
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

Top Contributor
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 ;)
 

Ähnliche Java Themen

Neue Themen


Oben