Ich hoffe einfach, das sich hier jemand mit mit JAXB auskennt und natürlich auch mit XML, da ich in keinem Programmierforum angemeldet bin und mich auch nicht extra anmelden will aber ich komme grade nicht weiter mit meinen Problemen, naja.
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:
oder so aufbauen sollte. Geht das überhaupt mit JAXB in beiden Varianten?
Naja, nun einmal mein Vorgehen soweit:
Beim Start rufe ich die MapLoader Klasse auf:
Hier mal der Code eines Raumes:
Wie man aber dann ja oben sieht, gebe ich ja bei Nachbar den Raum an, der dann ebend in der Richtung liegt aber würde das so überhaupt funktionieren? Normal bräuchte ich doch dann eine Referenz, die noch gar nicht existiert oder liege ich da falsch? Würde das so funktionieren?
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:
Würden denn dann auch die Verschachtelten Unterelemente, sprich die Ausgänge / Nachbarräume und die Gegenstaende so erstellt werden?
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:
oder müsste das außerhalb des raumes sein, also vor <raum> und dann den ganzen Raum einschließend oder spielt das keine Rolle?
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>