Java/Tutorials/Karteneditor II Kapitel 2

Aus Scientia
Version vom 24. Januar 2011, 12:23 Uhr von Alexis Hiemis (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Für unsere Karten werden wir unsere Karten-Klasse aus der ersten Tutorial nehmen.

public class Karte
{
	int[][] karte;
 
	String kartenName;
	String tilesetDateiname;
 
	ArrayList<BufferedImage> tileset=new ArrayList<BufferedImage>();
 
	public Karte(int[][] karte, String dateiname, String name)
	{
		this.kartenName=name;
		this.karte=karte;
		this.tilesetDateiname=dateiname;
		try {
			BufferedImage bildTileset=ImageIO.read(new File(dateiname));
			int breite=bildTileset.getWidth()/32;
			int höhe=bildTileset.getHeight()/32;
			for(int x=0;x<breite;x++)
			{
				for(int y=0;y<höhe;y++)
				{
					BufferedImage tile=bildTileset.getSubimage(x*32, y*32, 32, 32);
					this.tileset.add(tile);
				}				
			}
		} catch (IOException fehler) {
			fehler.printStackTrace();
		}
	}
 
 
	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;
	}
}

Nun erweitern wir diese um die beiden Klassen Variablen für die Höhe und die Breite. Diese Daten sind notwendig, so das keine Zechenleistung immer verschwendet wird für die berechnung der größer der Karte. Über die Funktion length bei dem karten Array bekommen wir die größe des Arrays (Höhe/Breite)herraus, was wiederum unsere Tileanzahl entspricht.


public class Karte
{
	int[][] karte;
 
	int breite;
	int höhe;
 
	String kartenName;
	String tilesetDateiname;
 
	ArrayList<BufferedImage> tileset=new ArrayList<BufferedImage>();
 
	public Karte(int[][] karte, String dateiname, String name)
	{
		this.kartenName=name;
		this.karte=karte;
		this.tilesetDateiname=dateiname;
 
		breite=karte.length;
		höhe=karte[0].length;
 
		try {
			BufferedImage bildTileset=ImageIO.read(new File(dateiname));
			int breite=bildTileset.getWidth()/32;
			int höhe=bildTileset.getHeight()/32;
			for(int x=0;x<breite;x++)
			{
				for(int y=0;y<höhe;y++)
				{
					BufferedImage tile=bildTileset.getSubimage(x*32, y*32, 32, 32);
					this.tileset.add(tile);
				}				
			}
		} catch (IOException fehler) {
			fehler.printStackTrace();
		}
	}
 
 
	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 Schritt brauchen wir eine Methode die unsere Klasse lädt, hierfür kopieren wir einfach den Teil aus der Klasse KartenDialog für das Laden von Karten, man muss gegebenfalls noch die Variablennamen anpassen. Diese Methode muss Statisch sein, so das man einfach eine Kartemit Karte.ladeKarte() laden kann. Als rückgabe Parameter wird die Klasse selbst sein, also von Typ Karte.

public class Karte
{
	int[][] karte;
 
	int breite;
	int höhe;
 
	String kartenName;
	String tilesetDateiname;
 
	ArrayList<BufferedImage> tileset=new ArrayList<BufferedImage>();
 
	public Karte(int[][] karte, String dateiname, String name)
	{
		this.kartenName=name;
		this.karte=karte;
		this.tilesetDateiname=dateiname;
 
		breite=karte.length;
		höhe=karte[0].length;
 
		try {
			BufferedImage bildTileset=ImageIO.read(new File(dateiname));
			int breite=bildTileset.getWidth()/32;
			int höhe=bildTileset.getHeight()/32;
			for(int x=0;x<breite;x++)
			{
				for(int y=0;y<höhe;y++)
				{
					BufferedImage tile=bildTileset.getSubimage(x*32, y*32, 32, 32);
					this.tileset.add(tile);
				}				
			}
		} catch (IOException fehler) {
			fehler.printStackTrace();
		}
	}
 
 
	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;
	}
 
	public static Karte ladeKarte(String kartendateiname)
	{
		try {
			FileInputStream datei = new FileInputStream(new File(kartendateiname));
			BufferedInputStream buf=new BufferedInputStream(datei);
			ObjectInputStream lese = new ObjectInputStream(buf);
 
			int[][]karte=(int[][]) lese.readObject();
			String name=(String) lese.readObject();
			String dateiname=(String) lese.readObject();
 
			Karte geladeneKarte=new Karte(karte,dateiname, name);
 
			lese.close();
			return geladeneKarte;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
}


Nun fügen wir unserer Karte unseren SpielFenster hinzu, in dem wir eine Klassenvariable karte erstellen. Und anschließend Initialiseren wir die Beispiel-Karte in Konstruktor und zwar über die Statische Methode ladeKarte(). Die Beispiel Datei heißt 1.karte. Wie man mehre Karten verwenden kann wird erst in der nächsten Tutorial erklärt, aber zu erst wollen wir ja auf unserer Karte herumlaufen.

public class SpielFenster extends JFrame{
 
 	Karte karte;
 
	public SpielFenster()
	{
		karte=Karte.ladeKarte("1.karte");
		setSize(new Dimension(640,480));
		setTitle("Spiel");
		setVisible(true);
	}
}