Aus einer XML Datei per Skript eine einfache Karte erstellen, welches Format eignet sich dafür am besten?



  • Jeder kennt doch sicher noch diese alten Textadventures, bei denen man durch Eingabe einer Richtung (z.b. north) in einen neuen Raum kam und dann konnte man in diesem Raum wieder irgend etwas machen.

    Nun möchte ich mir eine Karte über alle Räume erstellen, ohne dies aber alles händisch in einem Zeichenprogamm zeichnen zu müssen.

    Ich würde die Daten daher viel lieber als XML definieren und ein Script soll diese Daten dann auslesen und in ein entsprechendes druckbares Format, das sich dafür eignet, umwandeln.
    Ich dachte da z.b. an TeX oder SVG.

    Der Vorteil die Daten nur via XML zu definieren wäre der, dass Änderungen einfach durchführbar sind, bei einem Fehler in der Karte, müsste ich z.b. nur einen Wert in der XML Datei ändern, das Script ausführen und schon hätte ich meine neue grafische Karte.
    Auch das Anordnen der Räume geht so meiner Meinung nach einfacher.

    Meine XML Datei könnte z.B. so aussehen:

    <raum name="Hof">
      <door name="east">Flur</door>
      <door name="west">Straße</door>
      <color>green</color>
      <object>auto</object>
    </raum>
    <raum name="Flur">
      <door name="west">Hof</door>
      <door name="north">Vorzimmer</door>
      <door name="south">Saloon</door>
      <door name="east">"Besenkammer</door>
      <color>brown</color>
    </raum>
    <raum name="Besenkammer">
      <door name="west">Flur</door>
      <color>brown</color>
      <object>staubsauger</object>
    </raum>
    usw....
    

    Die Räume sind miteinander durch die entsprechenden door Attribute und Elementnamen die auf die Raumattribute verweisen verknüpft.

    Das ganze soll jetzt per Skript in eine skalierbare Grafik umgewandelt werden.
    Grafisch soll ein Raum als Viereck dargestellt werden und da wo er eine Türe hat, da ist an der entsprechenden Kante des Vierecks eine Lücke, das Viereck also nicht geschlossen.
    Und im Viereck steht dann mittig zentriert der Name des Raumes und das Element color bestimmt die Hintegrundfarbe, die das Viereck erhalten soll.
    Wenn der Raum ein Objekt hat, dann soll Objekt als kleines Icon in das Viereck in eines der Ecken gezeichnet werden, wenn es mehrere Objekte für den Raum gibt, dann kommen die an die Icons direkt daneben.
    Die Icons selbst werde ich mit einer weiteren Liste repräsentieren, die auf entsprechende Grafiken z.b. im SVG Format verweisen.

    Die Vierecke, die die anderen Räume repräsentieren, sollen dann, je nach Verknüpfung, neben diese Räume gezeichnet werden.

    Falls ein Raum von einem anderen Raum auf der Karte räumlich deutlich weiter entfernt sein sollte, weil z.b. noch dutzende andere Raumverknüpfungen das bedingen, dann soll die Verknüpfung mit einer Linie verbunden werden.

    Da ich das ganze später ausdrucken könnten möchte, soll es ein bekanntes Format sein, das skalierbar ist und das auch Text brauchbar drucken kann.

    Ich dachte da an SVG oder TeX, allerdings kenne ich mich mit keinem gut genug aus, um bewerten zu können, welches sich dafür am besten eignen könnte.
    In beide habe ich nur mal kurz reingeschnuppert, also mich höchstens 20 Minuten damit befasst.
    Momentan vermute ich mal, dass sich SVG dafür wohl besser eignen dürfte, aber vielleicht ist bei solch einfachen Grafiken auch TeX eine Option.

    Daher würde ich gerne von euch wissen, was für ein Format sich hier für die gestellte Aufgabe am besten anbieten würde, gerne auch ein anderes Format. Wichtig ist mir nur, dass es freie Programme, ob Freeware oder Open Source ist egal, gibt, die das Format lesen, eventuell noch darstellen und ausdrucken können, denn den Druckerpart möchte ich nicht auch noch programmieren.

    Eventuell werde ich anstatt XML auch JSON verwenden, aber das ist noch offen. JSON würde wahrscheinlich weniger Tipparbeit bedeuten.

    PS:
    Falls es so ein Script oder Programm schon gibt, (z.b. in irgend einer LateX Bibliothekssammlung) das so etwas durchführen kann, dann würde ich mir das natürlich auch gerne ansehen, eventuell spart das dann viel Arbeit.



  • Was ich noch vergessen habe zu erwähnen, es gibt nur die vier Richtungen Nord, Süd, Ost und West. Also keine Diagonalen und ähnliches.

    Karte automatisiert erste schrieb:

    PS:
    Falls es so ein Script oder Programm schon gibt, (z.b. in irgend einer LateX Bibliothekssammlung) das so etwas durchführen kann, dann würde ich mir das natürlich auch gerne ansehen, eventuell spart das dann viel Arbeit.

    Bezüglich fertiger Programme habe ich zwar ein paar gefunden, aber die damit erstellten Maps benötigen alle zu viel Platz.

    Ich möchte das nämlich so machen, dass jedes Viereck, das einen Raum repräsentiert, direkt an das andere Viereck, das den anderen Raum repräsentiert, anliegt, denn wenn die ganze Karte auf eine DinA4 Seite passen soll, dann kann ich nicht Platz für Verbindungslinien verschwenden, wenn diese vermeidbar sind.

    Also folgende Programme gehen zwar in die richtige Richtung, lösen aber das Problem nicht, ich muss also doch selber etwas programmieren.
    Das waren die anderen Programme:

    Mud Map kommt noch am ehsten an das gesuchte heran:
    https://sourceforge.net/projects/mudmap/

    Bei der folgenden Liste ist SVGmaps interessant, zumindest gibt es Ideen, wie es aus SVG Sicht aussehen könnte:
    http://www.ifarchive.org/indexes/if-archiveXmapping-tools.html

    Bei Trizbort sind die Abstände zu groß:
    http://trizbort.genstein.net/

    Also nichts dabei, ich werde selber etwas erstellen müssen, jetzt wäre nur noch die Frage, welches Dateiformat.


  • Mod

    Möglicherweise deutlich einfacher: DOT-Format. Das wäre eine recht einfache Umformung deiner Eingangsdaten. Das Tranformieren in beliebige Grafikformate machen dann andere Programme, wie z.B. graphviz. Nachteil: Du hast weniger Möglichkeit zum Tuning des genauen Aussehens.

    Ansonsten SVG. Deine Anforderungen sind nahezu eine Kopie der Designanforderungen von SVG.

    Ich möchte das nämlich so machen, dass jedes Viereck, das einen Raum repräsentiert, direkt an das andere Viereck, das den anderen Raum repräsentiert, anliegt, denn wenn die ganze Karte auf eine DinA4 Seite passen soll, dann kann ich nicht Platz für Verbindungslinien verschwenden, wenn diese vermeidbar sind.

    In vielen solchen Spielen gibt es aber nicht immer Verbindungen zwischen allen Räumen.



  • SeppJ schrieb:

    Möglicherweise deutlich einfacher: DOT-Format. Das wäre eine recht einfache Umformung deiner Eingangsdaten. Das Tranformieren in beliebige Grafikformate machen dann andere Programme, wie z.B. graphviz. Nachteil: Du hast weniger Möglichkeit zum Tuning des genauen Aussehens.

    Danke. Das DOT-Format werde ich mir mal ansehen.

    Ansonsten SVG. Deine Anforderungen sind nahezu eine Kopie der Designanforderungen von SVG.

    Das klingt gut, dann werde ich SVG nehmen, falls etwas gegen DOT sprechen sollte.

    In vielen solchen Spielen gibt es aber nicht immer Verbindungen zwischen allen Räumen.

    Deswegen kriegen die Kanten auch nur da eine Lücke, wo ne Türe ist.

    Mir ist allerdings noch ein anderes Problem eingefallen.
    Die Räume in XML zu definieren ist ja noch einfach, allerdings muss ich die ja auch durchlaufen und entsprechend in die Grafik setzten.
    Solange die alle in der richtigen Reihenfolge kommen ist es kein Problem, aber was, wenn da jetzt ein Raum ist, der von den bisher gesetzten noch dutzende Räume weg ist?
    Wo soll der dann hingesetzt werden?
    Bzw. wenn ich den für später zurückhalte, dann werden das unzählige Vergleiche werden.

    Ich benötige also auch eine Datenstruktur um die Räume ideal zu ordnen.
    Im Prinzip sind das ja ungerichtete Graphen.
    Die Räume sind die Knoten und die Verbindungen, also Türen zwischen den Räumen, die Kanten.
    Wäre daher dafür eine Adjazenzmatrix als Datenstruktur die beste Wahl?


Anmelden zum Antworten