Ich versuche grade ein komplett Objektorientiertes Konsolenspiel in Java zu programmieren. Dabei soll man aber auch Maps (Karten) mit einer XML Datei erstellen können und das versuche ich grade mit JAXB umzusetzen. Das Spiel soll dabei so die typischen Adventure Elemente haben. Einzelne Räume, Gegenstände, Monster etc.
Wobei ich jetzt die Probleme habe ist ja das Einlesen der Daten. Das speichern brauche ich ja eigentlich gar nicht, da es mir um das Laden der Karte geht. Irgendwie verstehe ich nicht ganz, wie das dann mit JAXB konkret funktionieren soll. Bisher habe ich ja die einzelnen räume etc. händisch im Programm erstellt und das war aber auch auf Dauer ein wenig unübersichtlich.
Ich bin mir auch ehrlich gesagt schon nicht einmal beim Aufbau der XML Datei sicher, ob bspw. ein Gegenstand einzeln so da sein oder ob der ein Unterpunkt des Raumes sein soll, also so:
Code:
<?xml version="1.0"?> <map> <raum> <beschreibung>Raum 1</beschreibung> <ausgaenge> <ausgang> <richtung>links</richtung> <nachbar>raum2</nachbar> </ausgang> <ausgang> <richtung>rechts</richtung> <nachbar>raum3</nachbar> </ausgang> </ausgaenge> <gegenstaende> <gegenstand> <name>Schwert</name> <beschreibung>Ein altes Eisenschwert. Schaden: 10</beschreibung> <schaden>10</schaden> </gegenstand> <gegenstand> <name>Wasser</name> <beschreibung>Eine volle Wasserflasche. Stillt den Durst.</beschreibung> </gegenstand> </gegenstaende> </raum> <raum> <beschreibung>Raum 2</beschreibung> <ausgaenge> <ausgang> <richtung>links</richtung> <nachbar>raum4</nachbar> </ausgang> </ausgaenge> </raum> </map>
Code:
<?xml version="1.0"?> <map> <raum> <beschreibung>Raum 1</beschreibung> <ausgaenge> <ausgang> <richtung>links</richtung> <nachbar>raum2</nachbar> </ausgang> <ausgang> <richtung>rechts</richtung> <nachbar>raum3</nachbar> </ausgang> </ausgaenge> </raum> <raum> <beschreibung>Raum 2</beschreibung> <ausgaenge> <ausgang> <richtung>links</richtung> <nachbar>raum4</nachbar> </ausgang> </ausgaenge> </raum> <gegenstaende> <gegenstand> <name>Schwert</name> <beschreibung>Ein altes Eisenschwert. Schaden: 10</beschreibung> <schaden>10</schaden> <raum>Raum 1</raum> </gegenstand> <gegenstand> <name>Wasser</name> <beschreibung>Eine volle Wasserflasche. Stillt den Durst.</beschreibung> <raum>Raum 1</raum> </gegenstand> </gegenstaende> </map>
Beim Start rufe ich die MapLoader Klasse auf:
Code:
import java.io.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "map")@XmlAccessorType(XmlAccessType.NONE)
public class MapLoader
{
public MapLoader()
{
}
public static MapLoader load(InputStream input) throws JAXBException
{
return (MapLoader) JAXBContext.newInstance(MapLoader.class).createUnmarshaller().unmarshal(input);
}
}
Code:
import java.util.Random;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "raum")@XmlAccessorType(XmlAccessType.NONE)
public class Raum
{
private String beschreibung;
private Monster monster;
private Inventar inventar;
@XmlElementWrapper(name = "ausgaenge")@XmlElement(name = "ausgang")
private Ausgang[] ausgaenge;
private static final int anzRichtungen = Richtung.values().length;
public Raum()
{
}
public Raum(String beschreibung)
{
this.beschreibung = beschreibung;
ausgaenge = new Raum[anzRichtungen];
inventar = new Inventar();
}
public String getBeschreibung()
{
return beschreibung;
}
@XmlElement(name = "beschreibung")
public void setBeschreibung(String beschreibung)
{
this.beschreibung = beschreibung;
}
public void setAusgang(Richtung richtung, Raum nachbar)
{
ausgaenge[richtung.ordinal()] = new Ausgang(richtung, nachbar);
}
public Raum getAusgang(Richtung richtung)
{
return ausgaenge[richtung.ordinal()];
}
public void addGegenstand(Gegenstand gegenstand)
{
gegenstaende.put(gegenstand.getName(), gegenstand);
}
public Gegenstand getGegenstand(String name)
{
return (Gegenstand) gegenstaende.get(name);
}
public Gegenstand removeGegenstand(String name)
{
return (Gegenstand) gegenstaende.remove(name);
}
public Monster getMonster()
{
return monster;
}
public void setMonster(Monster monster)
{
this.monster = monster;
}
}
Wäre das dann so oben auch mit der Ausgangs / Nachbarraumliste richtig? Da muss man dann ja sowohl das Root Element angeben als auch das XML Element oder?
So sieht bei mir der Ausgang aus:
Code:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "ausgang")@XmlAccessorType(XmlAccessType.NONE)
public class Ausgang
{
private Richtung richtung;
private Raum nachbar;
public Ausgang()
{
}
public Ausgang(Richtung richtung, Raum nachbar)
{
this.richtung = richtung;
this.nachbar = nachbar;
}
public Raum getNachbar()
{
return this.nachbar;
}
@XmlElement(name = "richtung")
public void setRichtung(Richtung richtung)
{
this.richtung = richtung;
}
@XmlElement(name = "nachbar")
public void setNachbar(Raum nachbar)
{
this.nachbar = nachbar;
}
}
Eine Sache wäre da auch noch aber wenn das so alles funktionieren würde, dann wüsste ich warscheinlich wie das funktioniert. Ich würde gerne einige spezielle Elemente wie den Eingang und den Ausgang in einer Variable in einer Klasse speichern. Müsste man denn dafür bspw. für den ausgang noch um den Raum1 oben im XML noch ein XML Attribut legen, also so:
Code:
<?xml version="1.0"?> <map> <raum> <exit> <beschreibung>Raum 1</beschreibung> <ausgaenge> <ausgang> <richtung>links</richtung> <nachbar>raum2</nachbar> </ausgang> <ausgang> <richtung>rechts</richtung> <nachbar>raum3</nachbar> </ausgang> </ausgaenge> <gegenstaende> <gegenstand> <name>Schwert</name> <beschreibung>Ein altes Eisenschwert. Schaden: 10</beschreibung> <schaden>10</schaden> </gegenstand> <gegenstand> <name>Wasser</name> <beschreibung>Eine volle Wasserflasche. Stillt den Durst.</beschreibung> </gegenstand> </gegenstaende> </exit> </raum> </map>






