Start Konfiguration

Autor: Matthias Thien

Bedienung und Funktionen

Im Bereich der Start Konfiguration wurden Möglichkeiten implementiert um beim Start Parameter zu übergeben. Dabei muss beachtet werden, dass die Parameter die hier angeführt werden, immer mit einem -- aufgerufen werden müssen. Wenn also vom Parameter resolution die Rede ist, dann wird immer --resolution auf der Kommandozeile verlangt. Ist bereits ein -- angegeben, so sollte kein weiteres -- angeführt werden. Soll ein Wert wie zum Beispiel ein on oder eine Auflösung gesetzt werden, so folgt ein =.

Parameterliste

Es wurden bislang fünf dieser Parameter implementiert, von denen eines bisher noch ohne Funktion ist. Dabei handelt es sich um V-Sync, was sich zwar übergeben und auch setzen lässt, aber noch keinen Nutzen im Spiel hat.

Folgende Tabelle zeigt alle verfügbaren Parameter mit Standardwerten und allen einstellbaren Werten:

Einstellung Parameter Standardwert Einstellungsmöglichkeiten
Auflösung resolution 800x600 Es kann jeder positive Wert für die Zahlen eingesetzt werden
Fenstermodus windowmode Windowed Windowed, Fullscreen
V-Sync vsync false true, false
Bloom bloom true true, false
Seed seed 42 64 Bit Integer ohne Vorzeichen

Kommandozeilenargumente

Das Einstellen der Auflösung ist in der Regel selbsterklärend. Um die Anfangsauflösung zu verändern nutzt man den Befehl resolution und als Werte gibt man seine gewünschte Auflösung mit einem x getrennt an. Wer seine Auflösung auf die Full-HD Auflösung ändern will, der nutzt somit folgendes Kommandozeilenargument: --resolution=1920x1080. Wer sich an der Standardwelt satt gesehen hat, ändert den Seed indem er den Parameter seed nutzt und ihm als Wert einen 64 Bit Integer Wert mitgibt. Dies sieht zum Beispiel so aus: --seed=18446744073709551615. Damit sollten genug Welten für die Entdecker zur Verfügung stehen.
Möchte der Spieler vom Fenstermodus in den Vollbildmodus wechseln, so hilft ihm dabei der Befehl windowmode. Hier gibt er als Wert an, ob er im Fenstermodus oder Vollbild starten möchte. Dazu nutzt er dann --windowmode=Windowed oder --windowmode=FullScreen. V-Sync und Bloom lassen sich mit der gleichen Art und Weise einschalten. Dafür wird ihnen als Wert entweder on oder off mitgegeben. Also wird Bloom mit --bloom=off ausgeschaltet.

Konfigurationsdatei

Eine weitere Möglichkeit eine Änderung der Einstellungen durchzuführen ist, eine Konfigurationsdatei einzulesen. Dafür kann der Nutzer sich die Standardeinstellungen als Datei ausgeben lassen, die er dann bearbeiten kann. Dazu nutzt man den Befehl write-config, der dann folgendes in eine Datei schreibt.

[Graphic]
resolution_width = 800
resolution_height = 600
windowmode = "Windowed"
bloom = true
vsync = false
[Game_settings]
seed = 42

Diese Datei liegt im Standardverzeichnis von Plantex und kann nun verschoben und bearbeitet werden. Dabei gibt es allerdings ein paar Punkte zu beachten. Zum einen muss der Nutzer immer dafür sorgen, dass die einzulesende Datei immer vollständig ist, damit Plantex diese verarbeiten kann. Zudem haben sich die anzugebenden Werte für Bloom und V-Sync geändert. Hier wird jetzt kein on oder off mehr verlangt, sondern ein true zum Einstellen und ein false zum Ausstellen der Parameter. Eine weitere Änderung ist das Trennen der Auflösung in Höhe und Weite. Um die Full-HD Auflösung einzustellen wird resolution_width = 1920 und resolution_height = 1080 gesetzt.

Zum Schluss wird die Datei mit dem Parameter config-file eingelesen. Als Wert wird dann der Pfad der Datei genutzt.

Einstellungsreihenfolge:

Intern ist eine Einstellungsreihenfolge gegeben welche festlegt, welche Einstellung nun übernommen werden. Dadurch wird zunächst die Standardkonfiguration geladen. Somit ist gewährleistet, dass das Spiel starten kann. Als nächstes wird geprüft ob es erwünscht ist, das eine Datei eingelesen wird und ob diese dann auch vorhanden ist. Ist beides gegeben, so wird die geladene Standardkonfiguration mit den Werten aus der Datei überschrieben. Zum Schluss werden diese Werte dann mit den Parametern aus der Kommandozeile überschrieben. Durch das Laden der Standardkonfiguration am Anfang, können entweder die Datei oder weitere Kommandozeilenargumente oder sogar beides weg gelassen werden und das Spiel könnte trotzdem starten.

Hilfe:

Damit der Benutzer sich nicht verlassen vorkommt wenn er die Kommandos nutzt wurde eine Hilfe und passende Fehlermeldungen eingebaut die ihm helfen sollen, seine Einstellungen zu tätigen. Gibt man als Kommandozeilenargument help ein, so wird dem Benutzer mit folgender Ausgabe geholfen:

Help Output:

Die Hilfe zeigt im oberen Bereich ein paar Informationen zum Spiel an. Darunter folgt ab dem USAGE die Nutzung der Parameterliste. FLAGS sind dabei Parameter ohne Werte. Bei OPTIONS müssen Werte übergeben werden. Wo diese Werte eingefügt werden müssen wird durch die spitzen Klammern signalisiert. Die Hilfe am Ende der Zeile zeigt, wie diese Werte auszusehen haben, damit sie akzeptiert werden.

Fehlermeldungen:

Sollte der Benutzer einen falschen Wert in den Kommandos übergeben oder gleich ein falsches Kommando, so bekommt er eine Fehlermeldung. Die Beispielausgabe basiert auf der Eingabe von resolution=awesome. Jeder Befehl hat solche Fehlermeldungen, um dem Benutzer zu zeigen, welches seiner Argumente nicht korrekt war.

Error Message

Programmierung

Arbeiten mit der Kommandozeile

Auslesen der Kommandozeilenbefehle

Um Eingaben von der Kommandozeile entgegennehmen und dann vernünftig bearbeiten zu können wurde clap genutzt. Mit den clap-Funktionen wird zunächst eine App erstellt, zu welcher die Kommandozeilenargumente zugeordnet werden. Dies geschieht durch das Kommando App::new("Plantex"). Damit heißt unsere App nun Plantex. Mit dem Parameter .version(env!("CARGO_PKG_VERSION")) ist es möglich eine Versionsnummer zu speichern diese durch den Befehl in den Klammern aus der plantex/Cargo.toml auszulesen. Mit dem .about()-Parameter ist es zudem möglich eine Information über die Anwendung auszugeben.

Der am häufigsten verwendete Parameter ist jedoch der .arg()-Parameter, mit dem es möglich ist die Kommandozeilenargumente zu binden und später zu nutzen. In diesem wird, ähnlich wie bei der App, mit Arg::with_name() ein Arg erstellt, der wieder unterschiedliche Parameter beinhalten kann. Mit dem übergebenen Namen können wir später das Kommando auswählen und dann behandeln. Dem Parameter .help() können wir einen String zuweisen, der ausgegeben wird, sobald der Nutzer des Programms die Hilfe aufruft (siehe Bild zu Hilfe im oberen Abschnitt). .takes_value(true) muss gesetzt werden, wenn der Benutzer später dem Befehl einen Wert wie eine Auflösung mitgeben können soll und in .long() wird festgelegt wie der Kommandozeilenbefehl lautet.

Der letzte Parameter der in der Kette angefügt wird ist .get_matches() mit dem es möglich ist das ganze einer Variable zu zuweisen um die Kommandos im späteren Programmverlauf nutzen zu können.

Die oben genannten Parameter werden in der Plantex Konfigurationssteuerung dann wie folgt verwendet. Dabei wird für jedes Kommando das eingelesen werden soll ein .arg Abschnitt erstellt.

let matches = App::new("Plantex")
            .version(env!("CARGO_PKG_VERSION"))
            .about("Game about Plants!")
            .arg(Arg::with_name("Resolution")
                .help("(e.g. =1280x720) 'Sets Resolution to new value'")
                .takes_value(true)
                .long("resolution"))
            .get_matches();
Umsetzen der Befehle
if let Some(bloom) = matches.value_of("Bloom") {
        match bloom {
            "on" => toml_config.bloom = true,
            "off" => toml_config.bloom = false,
            _ => return Err("Bloom can only be set on or off on command line".into()),
        }
    }

Diese Zeilen Code behandeln die Variable die oben erstellt wurde. Die erste Zeile prüft, ob in der Variable matches, also in den Argumenten, das Kommando für Bloom vorhanden ist und speichert den Wert der zu diesem Kommando gehört in einer neuen Variable. An dieser Variable wird jetzt ein match aufgerufen. Im Beispiel gibt es nun drei Möglichkeiten: an, aus oder es wurde ein falscher Wert übergeben. Dementsprechend wird dann Bloom gesetzt oder eine Fehlermeldung ausgegeben.

Lesen und Schreiben einer .toml-Datei

Tom's Obvious, Minimal Language, kurz toml, ist ein Dateiformat um kleine Konfigurationsdateien zu schreiben und zu verwenden. Eine Beispiel toml-Datei ist unter dem Punkt Einstellungsreihenfolge bereits zu betrachten. Eine .toml-Datei ist mit rust einfach als String einlesbar und dann teilbar um an die einzelnen Bestandteile der Datei zu gelangen. Die in eckigen Klammern stehenden Parameter wie zum Beispiel [Graphic] sind Gruppeneinteilungen. Mit diesen ist es möglich die Parameter darunter mit value.lookup("Graphic.resolution_width") aufzurufen. Da die Methode nicht weiß, was der zugehörige Teil in der Datei bedeutet, wird die Rückgabe mit Methoden wie as_bool() oder as_str() zum Beispiel in Booleans oder Strings umgewandelt, bevor sie, wie bei den Kommandozeilenargumenten, mit einem matchabgefragt und umgesetzt werden kann.

results matching ""

    No results matching ""