Java/Tutorials/Karteneditor Kapitel 2
Was ist mit Kartenmodel gemeint?
Das Kartenmodel soll unsere Karte im Speicher repräsentieren. Da es viel Speicher kostet und unhandlich ist die Karte komplett als Bild im Speicher zu halten. brauchen wir etwas um die Karte mit nur wenig Speicher im RAM vorzuhalten. Hierfür ist die nächste Klasse da.
public class Karte { }
Nun stellt sich die Frage, was braucht eine Karte alles um eine Karte zu sein? Als erstes muss man verstehen, dass Bilder im Speicher Arrays(Felder) sind. Jeder Pixel repräsentiert ein Array-Element und hat als Inhalt einen Farbwert. z.B. 0 für die Farbe schwarz. Zweidimensionale Karten funktionieren nach dem selben Prinzip, nur das sie nicht 1 Pixel repräsentieren, sondern ein kleines Bild, also ein Tile. Jedes Tile wird also intern ein Wert zugewiesen, dies kann man ruhig ID nennen.
Daher brauchen wir als erstes ein zweidimensionales Array. Als Datentyp nehmen wir hierfür einen Integerwert, weil dieser wenig Speicher verbraucht. Eine 100x100 Karte würde im Speicher z.B. 20KB verbrauchen(ohne Grafiken!).
public class Karte { int[][] karte; }
Jeder Wert in diesen Array steht für ein Tile. Als nächstes benötigen wir eine Möglichkeit die Tile vorzuhalten. Hierfür ist eine ArrayList gut geeignet, da wir uns nicht um die maximale Größe der ArrayList sorgen müssen. Außerdem ist sie einfach zu handhaben.
public class Karte { int[][] karte; ArrayList tileset=new ArrayList(); }
Als nächstes brauchen wir eine Klasse die ein Bild repräsentiert. Hierfür nehmen wir, von den vielen von Java bereitgestellten Klassen, BufferedImage. Bevor wir weiter machen, kommt erstmal eine Exkursion in die Generics von Java.
public class Karte { int[][] karte; ArrayList<BufferedImage> tileset=new ArrayList<BufferedImage>(); }
Wie man erkennen kann, haben wir bei der ArrayList <BufferedImage> hinzugefügt. Generics sind in der Hinsicht nützlich, weil dadurch nur die Klassen hinzugefügt werden, die wir wollen. Ein String wäre beispielsweise schlecht als Tile.
Nun benötigen wir eine Methode, die uns die entsprechende Tile als BufferedImage, also als Bild zurück liefert, Hierfür erweitern wir unsere Klassen um die Methode getTileImage().
public class Karte { int[][] karte; ArrayList<BufferedImage> tileset=new ArrayList<BufferedImage>(); public BufferedImage getTileImage(int x, int y) { int tile=karte[x][y]; return tileset.get(tile); } }
Als Parameter wird die Position des Tiles benötigt. Dies ist später wichtig um in zwei For-Schleifen sich die Karte grafisch, in einen JPanel anzuzeigen.
Da wir ja einen Karteneditor entwickeln, brauchen wir noch eine Methode um die Karte zu ändern. Daher fügen wir eine Methode hinzu die dies vollbringt.
public class Karte { int[][] karte; ArrayList<BufferedImage> tileset=new ArrayList<BufferedImage>(); public BufferedImage getTileImage(int x, int y) { int tile=karte[x][y]; return tileset.get(tile); } public void setTile(int x, int y, int tileID) { karte[x][y]=tileID; } }
Die Methode setTile, ändert die ID eines Tile im Karten-Array, an der entsprechenden Position.
Nun fehlen uns nur noch zwei Variablen/Attribute um dieses Kapitel abzuschließen. Wir benötigen den Dateinamen des Tileset, also der Bilddatei die geladen werden soll. Diese ist wichtig für das spätere Speichern und Laden. Weiterhin brauchen wir noch einen Namen für die Karte, da es einfach unschön ist, eine Karte z.B. 0001 usw. zu nennen.
public class Karte { int[][] karte; String kartenName; String tilesetDateiname; ArrayList<BufferedImage> tileset=new ArrayList<BufferedImage>(); public BufferedImage getTileImage(int x, int y) { int tile=karte[x][y]; return tileset.get(tile); } public void setTile(int x, int y, int tileID) { karte[x][y]=tileID; } }
Im nächsten Kapitel folgt der Konstruktor dieser Klasse, wo wir eine Karte initialisieren und die Tileset Bilddatei laden und jedes einzelne Tile in der ArrayList schreiben.