XSkriptTutorial.Kapitel3-6
Search:
print pdf

3.5 The Type TUFOXScript-tutorialChapter 4 - Message windows for advanced users

MissingLink für Verweise auf noch nicht erstellte Abschnitte:

Begriffe, für die auf eine Definition verwiesen wird; Altes grün 33AA11

Die fertige Mission und Fehlersuche


Herzlichen Glückwunsch. Das Tutorial über die UFOs in X-Skript ist jetzt abgeschlossen. Hast du alles in den vergangenen Kapiteln richtig gemacht, solltest du ein Skript haben, dass in etwa so aussieht:

markieren
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
program UFOJagd;

const
  MissionText  = 'Unsere Aufklärungssateliten '
+ 'melden eine feindliche Jägerstaffel. Sie muss '
+ 'abgeschossen werden, bevor sie größeren Schaden '
+ 'anrichten kann.';

  MissionWin = 'Wir haben so eben die Nachricht '
+ 'erhalten, dass es der feindlichen Jägerstaffel '
+ 'gelungen ist, wichtige militärische Informationen '
+ 'zu stehlen. Zum Glück ist es ihnen gelungen, alle '
+ 'Jäger abzuschießen, bevor sie die Informationen '
+ 'weitergeben konnten.';

  MissionLoose = 'Wir haben so eben die Nachricht '
+ 'erhalten, dass es der feindlichen Jägerstaffel '
+ 'gelungen ist, wichtige militärische Informationen 
+ 'zu stehlen. Wenn sie die Jäger rechtzeitig '
+ 'abgeschossen hätten, hätten diese Informationen '
+ 'die Erde vielleicht niemals verlassen. Jetzt wird '
+ 'der Kampf noch schwerer werden.';
var
  BossUFO  : TUFO;


procedure TimeUp;
begin
  if BossUFO <> nil then   // Ist BossUFO ungleich NIL?
  begin
    BossUFO.escape;
    BossUFO := nil;        // Speicher von BossUFO freigeben
  end;
  Mission_Loose;
end;

procedure BossUFOShootDown(UFO : TUFO);
begin
  game_api_messageBox(UFO.Name + 'wurde abgeschossen.');
  BossUFO := nil;          // Speicher von BossUFO freigeben
end;

procedure UFOShootdown(UFO: TUFO);
begin
  // Hier muss nichts gemacht werden
end;

// Diese Prozedur wird aufgerufen, wenn die Mission gewonnen wurde
procedure OnMissionWin;
begin
  game_api_messageBox(MissionWin);
end;

// wird aufgerufen, wenn die Mission verloren wurde
procedure OnMissionLoose;
begin
  game_api_messageBox(MissionLoose);
end;

procedure StartMission;
var
  Index    : Integer;
  UFOs     : Integer;
  UFO      : TUFO;

begin
  // zufällige UFO-Anzahl ermitteln
  UFOs     := random(5) + 1;

  for Index := 1 to UFOs do
  begin
    UFO := ufo_api_CreateUFO();      // UFO erzeugen
    UFO.Name := UFO.Name + ' der Jägerstaffel';
    register_ufo_ShootDown(@UFOShootDown,UFO);
  end;

  // Boss-UFO erstellen
  BossUFO := UFO_api_CreateUFO();
  
  // Name des UFOs festlegen
  BossUFO.Name := 'Anführer der Jägerstaffel';
  
  // UFO positionieren (erscheint am Südpol)
  BossUFO.SetPosition(0,180);
  
  // UFO sofort sichtbar machen
  BossUFO.Visible := true;
  register_ufo_shootdown(@BossUFOShootDown, BossUFO);

  // Bei Ablauf des Zeitlimits wird die Prozedur TimeUp
  // aufgerufen und die Mission ist verloren
  event_register(@TimeUp,UFOs*90);
end;

begin
  MissionName := 'UFO-Angriff';
  MissionType := mzUFO;
end.

Im Verlaufe des Tutorials haben wir ja bereits gelernt, wie die Skripte getestet werden können. Zum Abschluss möchten wir noch ein paar Funktionen demonstrieren, wie der Skripteditor euch bei der Entwicklung von Skripten unterstützt.

Als erstes wäre da die Syntaxprüfung. Sie wird automatisch beim Speichern durchgeführt, kann aber auch manuell mit Strg + F9 aufgerufen werden. Sie hilft dabei, fehlende Semikolons, falsch gesetzte Klammern, Typenverletzungen und der gleichen aufzuspüren. Startet Ihr einen Test mit F9 wird vorher automatisch die Syntaxprüfung durchgeführt. Ein fehlerhaftes Skript kann nämlich nicht ausgeführt werden. Strg + F9 ist hilfreich, wenn ihr nur mal schnell prüfen wollt, ob syntaktisch alles im Skript korrekt ist.

Wenn die Syntaxprüfung keine Fehler ergibt, heißt das aber noch lange nicht, dass das Skript fehlerfrei laufen wird. Manche Fehler treten erst zur Laufzeit auf. Ein solcher Fehler könnte z.B. sein, wenn für ein UFO die Methode escape aufgerufen wird, das bereits entkommen ist. Außerdem kann es auch passieren, dass ein Skript zwar fehlerfrei funktioniert, aber nicht das macht, was es eigentlich sollte. Um solchen Fehlern auf die Schliche zu kommen, gibt es die Möglichkeit ein Skript im Editor mit F9 zu testen. Dabei werden sämtliche Nachrichtenfenster ausgegeben. Außerdem kann man alle im Skript festgelegten Register manuell auslösen (dafür erscheint ein extra Fenster). Kommt es zu einem Laufzeitfehler wird das Skript angehalten, eine Fehlermeldung ausgegeben und die entsprechende Zeile im Skript wird rot hervorgehoben. Häufigste Fehler sind dann, dass Objektvariablen (TUFO, TRaumschiff ...) nicht mit einem gültigen Wert (=nil) belegt sind, oder das entsprechende Spielobjekt zerstört wurde. Um solche Probleme zu umgehen, schaut euch nochmal das Kapitel 3.5 - Der Typ TUFO genauer an, da hier Tipps im Umgang mit globalen Variablen gegeben werden.

Gelingt es damit nicht, einen Fehler zu identifizieren, gibt es noch die Möglichkeit ein Skript schrittweise auszuführen. Wie in jeder guten Entwicklungsumgebung gibt es die Möglichkeit Haltepunkte zu setzen. Mit einem Haltepunkt wird eine Zeile markiert bei der angehalten wird, sobald der Programmlauf dort vorbei kommt.

Um einen Haltepunkt zu setzen, könnt ihr die Funktion "Haltepunkt setzen (F5)" () oder klickt einfach vor der entsprechenden Zeile in das graue Gutter. Daraufhin sollte die Zeile folgendermaßen markiert sein:

Wird der Test des Skriptes gestartet, ändert sich das Symbol, so dass ersichtlich wird, ob es sich um einen gültigen () oder ungültigen () handelt. Generell werden alle ausführbahren Zeilen mit markiert. Natürlich wird nur bei gültigen Haltepunkten das Skript angehalten. Um das Skript zeilenweise auszuführen, stehen euch die Funktionen Step Over (F8, ) und Step Into (F7, ) zur Verfügung. Step Over führt dazu, dass eigene Funktionen übersprungen werden. Meistens ist es sinnvoll ein Skript mit F7 anstatt F8 auszuführen, allerdings merkt man den Unterschied nur, wenn eigene Funktionen definiert sind, die manuell aufgerufen werden. Um das Skript bis zum nächsten Haltepunkt automatisch durchlaufen zu lassen, könnt ihr die Funktion Start (F9, ) nutzen.

Schließlich gibt es noch die Möglichkeit sich eine Liste mit aktuellen Variablen (globale Variablen, sowie lokale und Paramter der aktuellen Funktion) anzeigen zu lassen. Diese Funktion findet man unter Ansicht → Variablen anzeigen. Damit kann man nachprüfen, ob den Variablen zur Laufzeit auch wirklich die Werte zugewiesen werden, die man sich beim Erstellen des Skriptes vorgestellt hat.

Abschließend noch ein paar allgemeine Bemerkungen. Wenn man ein längeres Skript erstellen will, sollte man sich das ganze in mehrere Einzelschritte zerlegen, so wie das z.B. in den Abschnitten 3.1 bis 3.5 gemacht wurde. Nach jedem Einzelschritt kann dann erstmal auf Fehler geprüft werden. Tritt irgendwann ein Fehler auf, so hängt er meist mit dem zuletzt erstellten Einzelschritt zusammen, was die Fehlersuche stark vereinfacht. Wenn man ein Skript erst ganz am Ende testet, ist es viel schwieriger einen Fehler aufzuspüren, da man praktisch das ganze Skript berücksichtigen muss (der eigentliche Fehler muss nicht immer in der Zeile liegen, in der das Skript angehalten wird).


Recent Changes - Edit Menue
Page last modified on 10.11.2004, 21:40 by Natter
Edit Page - Attributes - Page History