Java/Tutorials/Karteneditor Kapitel 2
Was ist mit Kartenmodel gemeint?
Das Kartenmodel soll unsere Karte im Speicher repräsentieren. Da es viel Speicherkostet 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, das 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. 2D-Karten Funktionieren das 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 zugewießen, dies kann man ruhig ID nennen.
Daher brauchen wir als erstes ein 2 Dimmensionales Array. Als Datentyp nehmen wir hierführ einen Intergerwert, 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. Das nächste was wir brauchen, ist eine möglichkeit die Tile vorzuhalten. Hierfür ist ArrayList gut geeignet, weil wir uns nicht sorgen um die Maximale größe der ArrayList sorgen müssen und sie ist einfach zu handhaben.
public class Karte { int[][] karte; ArrayList tile=new ArrayList(); }
Als nächstes brauchen wir eine Klasse die ein Bild repräsentiert. Hierführ nehmen wir von den vielen von Java Bereitgestellt Klassen BufferedImage. bevor wir weiter machen, kommt erstmal eine Exkursion in die Generics von Java.
public class Karte { int[][] karte; ArrayList<BufferedImage> tile=new ArrayList<BufferedImage>(); }
Wie man erkennen kann, haben wir bei der ArrayList <BufferedImage> hinzugefügt. Generics sind in der hinsicht nützlich, weil da durch nur die Klassen hinzugefügt werden, die wir wollen, weil z.B. ein String währe schlecht als Tile.
Nun benötigen wir eine Methode, die uns die entsprechende TIle als BufferedImage, also als Bild zurück liefert, hierführ erweitern wir unsere Klassen um die Methode getTileImage().
public class Karte { int[][] karte; ArrayList<BufferedImage> tile=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-Schleife 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> tile=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 entsprechen position.
Nun Fehlen uns nur noch 2 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äter Speichern und Laden. Weiterhin brauchen wir noch einen Namen für die Karte, weil es ist einfach unschön, eine Karte z.B. 0001 usw. zu nennen.
public class Karte { int[][] karte; String kartenName; String tilesetDateiname; ArrayList<BufferedImage> tile=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.