MissingLink für Verweise auf noch nicht erstellte Abschnitte:
Begriffe, für die auf eine Definition verwiesen wird; Altes grün 33AA11
Sprachen
Nachdem wir im letzten Kapitel gelernt haben, wie man Strings für Nachrichtenfenster formatieren kann, wollen wir uns jetzt der Umsetzung verschiedener Sprachen zuwenden. Als Beispiel werden wir ein ganz einfaches „Hallo Welt“ Skript nehmen und dieses mit verschiedenen Sprachen ausstatten. Dazu erstellen wir "Bereiche" im Skript, die nur ausgeführt werden, falls ein bestimmtes
"bedingtes Symbol" definiert ist. In unserem Fall handelt es sich dabei um die verschiedenen Sprachen, die der Spieler in X-Force auswählen kann. Im Folgenden ist unser Beispiel um die zwei Sprachen Deutsch und Englisch sowie einer Alternative (falls der Spieler weder deutsch noch englisch gewählt hat) erweitert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
program HalloWelt;
const
Message1 = 'Hallo Welt!';
Message1 = 'Good morning Vietnam!';
Message1 = 'Sorry, your language isn''t supported';
procedure StartMission;
begin
game_api_messageBox(Message1);
end;
begin
MissionName := 'HalloWelt lesen';
end. |
Zum Anlegen eines Bereiches, der nur berücksichtigt wird, wenn ein bestimmtes "bedingtes Symbol" definiert ist, wird
{$IFDEF Symbolname} ... {$ENDIF} verwendet. Alles was dazwischen steht wird nur ausgeführt, falls das hinter
IFDEF angegebene "bedingte Symbol" definiert ist. Alternativ kann man auch
{$IFNDEF Symbolname} ... {$ENDIF} verwenden. In diesem Fall wird das dazwischenstehende nur berücksichtigt, falls der Symbolname nicht definiert ist.
Die "bedingten Symbole" der Sprachen sind automatisch vordefiniert (je nachdem, welche Sprache der Spieler ausgewählt hat). Natürlich kann man auch eigene "bedingte Symbole" definieren. Dies erfolgt mit
{$DEFINE Symbolname}. In unserem Beispiel wurde das in Zeile 8 bzw. 14 angewendet, um sich zu merken, dass die Konstante
Message1 bereits definiert wurde. Dies ist wichtig, da ja auch der Fall eintreten könnte, dass der Spieler eine Sprache auswählt, die nicht berücksichtigt wurde (z.B. Spanisch oder Russisch). Für diesen Fall muss eine Alternative bereitgestellt werden, um sicherzustellen das unsere Konstante
Message1 trotzdem definiert wird. Ansonsten würde es beim Aufruf des Textfensters in Zeile 28 zu einem Fehler kommen. In der Praxis empfiehlt es sich als Alternative einfach den englischen Text zu verwenden, da dies die am weitesten verbreitete Sprache ist (natürlich braucht man dann nicht mehr extra zu prüfen, ob der Spieler die Sprache Englisch gewählt hat).
Wichtig ist, dass die "bedingten Symbole" nicht mit Variablen und if-Bedingungen gleich zusetzen sind. Die "bedingten Symbole" arbeitet der sogenannte PreProcessor ab. Dieser PreProcessor läuft vor der eigentlichen Verarbeitung der Skripte. Deutlich wird dies, wenn man einen Syntax-Fehler im Skript hat. Normalerweise werden diese immer angemeckert. Wird allerdings der Abschnitt mit dem Fehler über die bedingten Symbole ausgeblendet, so hat dieser Fehler keine Bedeutung mehr. Nützlich sind die "bedingten Symbole" vor allem (neben den verschiedenen Sprachen natürlich) um das Skript zu testen. So kann man Testausgaben machen, die nur angezeigt werden, wenn ein bestimmtes Symbol gesetzt ist.
Beispiel:
1 2 3 4 5 6 7 8 9 10 11
|
...
procedure StartMission;
var
UFOs: Integer;
begin
UFOs:=random(5)+1;
game_api_MessageBox(IntToStr(UFOs));
end; |
In dieser Konstellation würde immer die Anzahl der UFOs angezeigt werden. Würde man nun das bedingte Symbol löschen (dazu reicht einfach aus
{$DEFINE DEBUG} {.$DEFINE DEBUG} zu machen), wird die Nachricht nicht mehr angezeigt.