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:
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.
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 match
abgefragt und umgesetzt werden kann.