Die Skriptsprache |
Nun ist es an der Zeit, diese mysteriösen Skripte
einzuführen. Sie kontrollieren das Verhalten der Entities, die Benutzeroberfläche
und das gesamte Spiel überhaupt. C-Script
ist eine Programmiersprache, in der Sie der Engine sagen, wie sich Teile Ihrer
Welt verhalten sollen. Sie können also Ihr Spiel in dieser Sprache programmieren.
Aber keine Angst: Sie müssen jetzt noch keine Programmiersprache lernen.
Wir werden unser Spiel heute nicht selbst programmieren, wir lassen es (fast)
automatisch von 3D GameStudio programmieren.
Öffnen
Sie einen Level (falls Sie gerade einen erstellt haben, speichern Sie ihn, damit
er einen Namen bekommt). Dann wählen Sie
File / Map Properties / NewScript. Im Skriptfenster erscheint jetzt
der Name einer Scriptdatei. Diese Datei wurde eben automatisch in Ihrem Arbeitsverzeichnis
erstellt; sie hat den gleichen Namen wie Ihr Level. Sie enthält den kompletten
Programmcode für ein Spiel, komplett mit Level laden, Menü, und Standard-Verhaltensmustern
für Entities.
C-Script erlaubt das Aufteilen des Spiel-Codes in
kleinere modulare Teile. Ein solches Modul ist das Verhaltensmuster einer bestimmten
Entity. Es wird in einer Aktion definiert
und als eine Liste von der Reihe nach ausgeführten Instruktionen
(Anweisungen) beschrieben. So funktioniert eine Programmiersprache. Schauen
wir uns das mal näher an: Setzen Sie
eine Entity in Ihr Level, von der Sie wollen, dass sie eine Aktion zugewiesen
bekommt. Zur Abwechslung nehmen wir nun eine Map-Entity, z.B. die Aufzugskabine:
Wählen Sie also Object / Add Map Entity
/ lift1.wmb . Öffnen Sie nun das Eigenschaftsfenster dieser
Entity (Properties/Behaviou) und klicken
Sie aufs Ordner-Symbol neben dem Action-Feld.
![]() |
Aus der Liste der verfügbaren Aktionen wählen Sie per Doppelklick ent_rotate, dann klicken Sie OK. In das Entrot_Pan-Feld der Aufzugs-Entity setzen Sie den Wert 3. Speichern und kompilieren Sie (Build). Wählen Sie jetzt File / Run Level. Anders als beim Walkthru wird nun das Skript gestartet und nicht das Level. Vergewissern Sie sich, dass das Window-Kästchen markiert ist, solange Sie an Ihrem Level entwickeln. Im Fullscreen-Modus können Sie nämlich sonst keine Fehlermeldungen, wie z.B. fehlende Dateien oder zu kleiner Nexus, während des Spiels sehen. |
Das erste,
was Ihnen vermutlich auffällt, ist die Tatsache, dass Sie sich nicht mehr
bewegen können. In einem wirklichen Game brauchen wir eine Player-Entity
mit einer Bewegungsaktion, und die fehlt noch in unserem Level (Sie könnten
z.B. die Wache guard.mdl einfügen
und ihr die player_walk-Aktion zuweisen).
Im Moment genügt es aber, einfach nur die [0] -Taste zu drücken,
und die Kamera kann wie zuvor bewegt werden. Schauen Sie auf den Fahrstuhl -
und wow! Es bewegt sich was in Ihrem Level! Beobachten Sie die Kabine, wie sie
langsam rotiert. Wie kann das erreicht werden?
Alle Aktionen in der Liste oben sind entweder in unserem neu erzeugten Skript,
oder in einem der 'vorgefertigten' Skripte im Template-Ordner
enthalten. Werfen wir als Beispiel einen Blick auf unsere ent_rotate-Aktion.
Öffnen Sie Resources
/ Resources / Actions im Projektfesnter, und doppelklicken Sie die ent_rotate
Aktion in der alphabetisch sortierten Liste:
Wenn Sie mit C oder Javascript nicht vertraut
sind, sieht das auf den ersten Blick ziemlich kompliziert aus. Es ist der Satz
"Ich drehe mich permanent um meine drei Raumachsen (Pan, Tilt, Roll) mit
vorgegebenen Rotationsgeschwindigkeiten, so lange ich sichtbar bin und meine
Position nicht verändert wurde" übersetzt in C-Script.
Alles nach den "//"-Zeichen ist nur ein Kommentar für den Leser. Anweisungen enden mit einem Semicolon ";" und sind mit geschweiften Klammern "{ }" zu Gruppen zusammengefasst. Alle Entity-Aktionen werden bei Spielstart gleichzeitig gestartet. Vielleicht können Sie schon ein paar Strukturen im Chaos der Anweisungen oben erkennen. Zuerst werden einige Entity-Eigenschaften initialisiert (MY ist die Entity selbst, der Punkt dahinter bedeutet, dass die Eigenschaft zu dieser Entitiy gehört). Dann kommt dann die WHILE-Anweisung ins Spiel. While (irgendwas){ ... } bedeutet: Wiederhole die Anweisungen zwischen den geschweiften Klammern, solange "irgendwas" gilt. Dies nennt man eine Schleife. Innerhalb dieser Klammern werden die drei ENTROT..-Winkelgeschwindigkeiten mit der Zeit pro Bildzyklus multipliziert und zu den Winkeln der Entity hinzuaddiert. Dadurch verändern sich diese Winkel unablässig, mit anderen Worten: die Entity rotiert Der "// uses..." Kommentar sagt WED, welche Entity-Parameter im Behaviour-Feld eingegeben werden können.
Wir wollen nun spaßeshalber eine kleine Entity-Aktion selbst schreiben. Sorgen Sie dafür, dass 'Reload externally modified files' in Files/Preferences auf Auto gesetzt ist, anderfalls müssten wir unseren Level in WED schließen und wieder öffnen. damit in WED's Aktions-Liste eine neu hinzugefügte Aktion erscheint. Öffnen Sie nun Resources / (Name Ihres Levels) / Script Files, und doppelklichen Sie das Skript dort, das den gleichen Namen wie Ihr Level hat, nur mit .WDL Extension (etwa "mylevel.wdl"). Windows' Notepad® öffnet nun Ihr neues Skript zum Editieren (Sie können einen anderen Editor in File/Preferences/Editors auswählen, aber es muss ein reiner Texteditor sein - Word® geht nicht!). Gehen Sie an den Schluss dieser Textdatei. Dort tippen Sie nun die folgende Aktion ein, und achten Sie darauf, sich nicht zu verschreiben:
action
ent_roll
{
while(1)
{
if(key_r == on) { my.roll += 5*time; }
wait(1);
}
}
Speichern Sie diese Skriptdatei. Selektieren Sie die Aufzugs-Entity, öffnen Sie Properties / Behaviour und Sie finden nun Ihre selbstgeschriebenen Aktion ent_roll in der Liste! Wählen Sie diese wie vorher. Speichern Sie, compilieren Sie (Build), und starten Sie (Run) den Level. Schauen Sie, was Ihre Aktion jetzt mit dem Aufzug macht, solange Sie die [R]-Taste gedrückt halten!
Wenn Sie diese Aktionen noch nicht verstanden haben, keine Angst: Sie werden - sobald Sie das erste Kapitel des Tutorials "Spiele programmieren in 6 Tagen" durchgearbeitet haben. Dieses Tutorial sowie eine ausführliche Beschreibung aller Skript-Anweisungen finden Sie im Handbuch (Manual) in Ihrem Gamestudio-Ordner. Noch ein wichtiger Rat: Wenn Sie später eigene Programme schreiben, werden Sie merken, dass man den gleichen Effekt auf verschiedene Arten erreichen kann. Benutzen Sie die einfachste. Versuchen Sie Ihre Funktionen nicht nur so einfach und kurz wie möglich, sondern auch dem wirklichen Leben möglichst ähnlich zu machen (was oftmals aufs selbe hinausläuft). Wenn Sie beispielsweise ein Objekt zu Boden fallen lassen wollen, sollten Sie dabei berücksichtigen, wie dies im realen Leben vonstatten geht. Da gibt es eine Anziehungskraft, die die absolute Z-Geschwindigkeit des Objekts erhöht. Versuchen Sie die realen Kräfte in Ihrem Code zu simulieren.