Java/Tutorials/Entwicklung eines einfachen Karteneditors IV/Kapitel 8

Aus Scientia
Wechseln zu: Navigation, Suche

Zu aller erst passen wir unsere Karten-Klasse für die Engine an


Als erstes fügen wir als Klassenvariable ein, wo wir alle Events abspeichern, dafür bietet sich z.B. ArrayList an. Wir verwenden 2 ArrayList, die nach auslöseTyp aufgeteilt sind, in moveoverEvents werden Events gespeichert die per per Berürhung ausgelöst werden und in keypressEvents, werden Events gespeichert die durch Tasten druck ausgelöst werden z.B. NPC.

public class Karte
{
	...
	public ArrayList<Event> moveoverEvents = new ArrayList<Event>();
	public ArrayList<Event> keypressEvents = new ArrayList<Event>();
	...
}

Nun passen wir unsere Methode ladeKarte() wie folgt an, wir kopieren was wir in der KartenMenü-Klasse beim Laden hinzugefügt habe,

			Integer eventAnzahl = (Integer) lese.readObject();
 
			for(int i=0;i<eventAnzahl;i++)
			{
				Integer auslöseTyp = (Integer) lese.readObject();
				Point position = (Point) lese.readObject();
				String quelltext = (String) lese.readObject();
				Event event=new Event(quelltext, auslöseTyp, position);
				fenster.aktuelleKarte.events.put(position.x+","+position.y, event);
			}

in unsere Methode an der richtigen stelle und ersetzen, das fenster.akteuell........

	fenster.aktuelleKarte.events.put(position.x+","+position.y, event);

durch

				if(auslöseTyp == 0)
				{
					geladeneKarte.moveoverEvents.add(event);
				}
				else if(auslöseTyp == 1)
				{
					geladeneKarte.keypressEvents.add(event);
				}

Das machen wir, da wir einerseits der Ort der ArrayList wo anders ist und anderer seits es keine HashMap sondern eine ArrayList nun ist. Weiterhin fügen wir einen neuen Paramter der Methode ladeKarte hinzu und zwar die SpielFenster-Klasse.

	public static Karte ladeKarte(String kartendateiname, SpielFenster fenster)
	{
		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();
			int[] passmap=(int[]) lese.readObject();
 
			Karte geladeneKarte=new Karte(karte,dateiname, name);
			geladeneKarte.passmap=passmap;
 
			Integer eventAnzahl = (Integer) lese.readObject();
 
			for(int i=0;i<eventAnzahl;i++)
			{
				Integer auslöseTyp = (Integer) lese.readObject();
				Point position = (Point) lese.readObject();
				String quelltext = (String) lese.readObject();
				Event event=new Event(quelltext, auslöseTyp, position, fenster);
				if(auslöseTyp == 0)
				{
					geladeneKarte.moveoverEvents.add(event);
				}
				else if(auslöseTyp == 1)
				{
					geladeneKarte.keypressEvents.add(event);
				}
			}
 
			lese.close();
			return geladeneKarte;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}


In unserer SpielFenster klasse, ändern wir nun im Konstruktor, das Laden der Karte wie folgt:

		karte=Karte.ladeKarte("1.karte");

in

		karte=Karte.ladeKarte("1.karte",this);