Hallo,
ich bin grade dabei eine Konsolenspiel zu erstellen, das ein Labyrinth von Räumen darstellen soll und man soll ebend auch per XML eine Karte / Level, wie auch immer erstellen können. Bis jetzt habe ich die einzelnen Räume, Gegenstände usw. alle im Spiel "hardcoded" aber ich würde das gerne Level per XML erstellen können. Da bin ich dann auch JAXB gestoßen und das einlesen etc. funktioniert auch schon aber ich komme nicht weiter, weil ich ja bei einem Raum dann bspw. eine Referenz auf einen anderen brauche, also wie kriege ich das hin?
Hier mal eine XML Datei als Beispiel:
Da wird ja bspw. bei dem Eingangsraum schon ein nächster Raum (Raum2) genannt aber kann man das so überhaupt umsetzen oder müsste man das dann irgendwie so abändern, das dann erst die Räume erstellt werden und dann die gaenge / Verbindungen, wie auch immer geschaffen werden oder geht das auch wie oben beschrieben oder ähnlich?
Ich habe da auch noch ein kleines Problem mit den setzen der Gänge bzw. der Verbindungen zwischen den Räumen. Vorher habe ich das so gemacht:
aber das geht ja dann jetzt mit JAXB so nicht mehr? Bräuchte ich dann für den Gang eine eigene Klasse? Das Problem ist ja, das ich das auch weiter mit dem ordinal() haben will und die ausgaenge sind natürlich in einem Raum Array gespeichert aber wie speichere ich dann die Wert trotzdem in dem Array ab?
So sieht die Raum Klasse übrigens komplett aus:
So könnte dann ja warscheinlich der "Gang" aussehen:
Oben in der Raum Klasse sieht man ja auch noch das mit der setMonster Methode. Das würde dann ja auch so nicht mehr funktionieren oder? Da kann man dann ja nicht hinschreiben:
also wie bringt man dann nachher den Raum dazu, das auch das Monster in den Raum aufgenommen wird?
Ich würde auch noch gerne den Eingang und evtl. die "Ausgänge" in einer Klasse "Level" oder ähnlich speichern. Dafür habe ich auch das XML Attribut "eingang" und "ausgang" erstellt. Da bräuchte ich dann ja auch wieder die Raum Referenz oder nicht?
An den Stellen komme ich grad einfach nicht mehr voran.
Ich würde mich sehr über Hilfe freuen und danke schon einmal im voraus!
ich bin grade dabei eine Konsolenspiel zu erstellen, das ein Labyrinth von Räumen darstellen soll und man soll ebend auch per XML eine Karte / Level, wie auch immer erstellen können. Bis jetzt habe ich die einzelnen Räume, Gegenstände usw. alle im Spiel "hardcoded" aber ich würde das gerne Level per XML erstellen können. Da bin ich dann auch JAXB gestoßen und das einlesen etc. funktioniert auch schon aber ich komme nicht weiter, weil ich ja bei einem Raum dann bspw. eine Referenz auf einen anderen brauche, also wie kriege ich das hin?
Hier mal eine XML Datei als Beispiel:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <karte> <raueme> <raum> <eingang> <name>eingang</name> <beschreibung>Der Eingang des Labyrinths</beschreibung> <gaenge> <gang> <richtung>norden</richtung> <nachbar>raum2</nachbar> </gang> </gaenge> </eingang> </raum> <raum> <name>raum2</name> <beschreibung>Ein etwas größerer Raum</beschreibung> <gaenge> <gang> <richtung>norden</richtung> <nachbar>raum3</nachbar> </gang> </gaenge> </raum> <raum> <ausgang> <name>raum3</name> <beschreibung>Ein etwas größerer Raum 2</beschreibung> <gaenge> <gang> <richtung>westen</richtung> <nachbar>raum4</nachbar> </gang> </gaenge> <monster> <name>Oger</name> <leben>100</leben> <schaden>15</schaden> </monster> </ausgang> </raum> </raueme> </karte>
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <karte> <raueme> <raum> <eingang> <name>eingang</name> <beschreibung>Der Eingang des Labyrinths</beschreibung> </eingang> </raum> <raum> <name>raum2</name> <beschreibung>Ein etwas größerer Raum</beschreibung> </raum> <raum> <ausgang> <name>raum3</name> <beschreibung>Ein etwas größerer Raum 2</beschreibung> <monster> <name>Oger</name> <leben>100</leben> <schaden>15</schaden> </monster> </ausgang> </raum> </raueme> <gaenge> <gang> <raum>eingang</raum> <richtung>norden</richtung> <nachbar>raum2</nachbar> </gang> <gang> <raum>raum2</raum> <richtung>norden</richtung> <nachbar>raum3</nachbar> </gang> <gang> <raum>raum3</raum> <richtung>westen</richtung> <nachbar>raum4</nachbar> </gang> </gaenge> </karte>
Code:
private Raum[] gaenge; public void setGang(Richtung richtung, Raum nachbar) { gaenge[richtung.ordinal()] = nachbar; }
So sieht die Raum Klasse übrigens komplett aus:
Code:
@XmlRootElement(name = "raum")@XmlAccessorType(XmlAccessType.NONE) public class Raum { private String beschreibung; private Monster monster; private Gegenstaende gegenstaende; private Raum[] gaenge; private static final int anzahlRichtungen = Richtung.values().length; public Raum() { } public Raum(String beschreibung) { this.beschreibung = beschreibung; gaenge = new Raum[anzahlRichtungen]; gegenstaende = new Gegenstaende(); } @XmlElement(name = "beschreibung") public void setBeschreibung(String beschreibung) { this.beschreibung = beschreibung; } public void setzeAusgang(Richtung richtung, Raum nachbar) { gaenge[richtung.ordinal()] = nachbar; } public Raum getGang(Richtung richtung) { return gaenge[richtung.ordinal()]; } public String gibGaenge() { Richtung[] richtung = Richtung.values(); String gaenge = ""; for(int i = 0; i < ausgaenge.length; i++) { if(ausgaenge[i] != null) gaenge += " " + richtung[i].name().toLowerCase(); } return gaenge; } public void setMonster(Monster monster) { this.monster = monster; } }
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 = "gang")@XmlAccessorType(XmlAccessType.NONE) public class Gang { private Richtung richtung; private Raum nachbar; public Gang() { } public Gang(Richtung richtung, Raum nachbar) { this.richtung = richtung; this.nachbar = nachbar; } @XmlElement(name = "richtung") public void setRichtung(Richtung richtung) { this.richtung = richtung; } @XmlElement(name = "nachbar") public void setNachbar(Raum nachbar) { this.nachbar = nachbar; } }
Code:
@XmlElement(name = "monster") public void setMonster(Monster monster) { this.monster = monster; }
Ich würde auch noch gerne den Eingang und evtl. die "Ausgänge" in einer Klasse "Level" oder ähnlich speichern. Dafür habe ich auch das XML Attribut "eingang" und "ausgang" erstellt. Da bräuchte ich dann ja auch wieder die Raum Referenz oder nicht?
Code:
import java.util.Arrays; 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 = "level")@XmlAccessorType(XmlAccessType.NONE) public class Level { private Raum eingang; private Raum[] ausgaenge; public Level() { } public Level(Raum eingang, Raum[] ausgaenge) { this.eingang = eingang; this.ausgaenge = ausgaenge; } public Raum getEingang() { return eingang; } @XmlElement(name = "eingang") public void setEingang(Raum eingang) { this.eingang = eingang; } @XmlElement(name = "ausgang") public void setAusgang(Raum ausgang) { ausgaenge[0] = ausgang; // vielleicht auch mehrere Ausgänge } public boolean istAusgang(Raum raum) { return Arrays.asList(ausgaenge).contains(raum); } }
Ich würde mich sehr über Hilfe freuen und danke schon einmal im voraus!
Comment