Timers MMM-Seite
  Erstes Intro
 

Oho, jetzt geht es los mit der Programmiererei. Nun, wie gehen wir das an? Ich könnte euch natürlich jetzt erst einmal alle Funktionen erklären, euch beschreiben, wo ihr was hinschreibt, aber das... wäre fast nur Lernarbeit. Nein, nein. Ihr werdet jetzt sofort aktiv.
Wir programmieren uns jetzt nämlich ein Intro für das Spiel.

OK... Wie geht das? Am besten, wir öffnen erst einmal den Raum, in dem das Intro statt finden soll. Da es Bernards Haus ist, ist Bernards Zimmer mehr als geeignet dafür - also öffnen wir erst einmal sein Zimmer:
In der Leiste links ist ganz unten der Punkt "Room Editor". Den klicken wir an und wählen nun auf der rechten Seite den Raum 1 aus, also Bernards Zimmer.
Wenn wir den Raum geöffnet haben, sehen wir das Hintergrundbild des Raums und darüber ein paar Knöpfe, Schaltflächen und Kästchen. Die meisten interessieren uns jetzt noch nicht, wir wollen erst einmal das Intro scripten. Dafür öffen wir erst einmal den "Interaction Editor", indem wir auf den "I"-Knopf klicken. Im Interaction Editor ist eine ganze Liste an Punkten zu sehen - von "Walk off left screen edge" bis "player leaves room". Für uns spielt aber im Moment nur ein Punkt eine Bedeutung: "First time player enters room". Den klicken wir mit der rechten Maustaste an und wählen "New Run script action" aus.

So, was sehen wir jetzt? Ein neues Fenster müsste sich geöffnet haben... leer, bis auf eine Zeile grünem Text. Und da müssen wir ein Intro hinzaubern... Puh.

Aber keine Angst. Am Anfang erscheint einem das ganze vielleicht noch etwas rätselhaft, doch wenn ihr erst einmal die Grundlagen habt, geht der Rest wie am Schnürchen.

Gut... Am besten, wir fangen mit etwas ganz einfachem an: Wir lassen Bernard etwas sagen. Das geht mit diesem Befehl:

player.Say ("Hallo, MMM Fans!");

Gut. Den Befehl haben wir. Aber wie funktioniert er?
Eigentlich ganz einfach. Der Befehl besteht aus drei Hauptabschnitten:

player Das ist die handelnde Person, also die Figur, die wir kontrollieren wollen. In diesem Fall ist es der aktive Hauptcharakter, der "player". Andere Figuren lassen sich kontrollieren, indem man vor ihren Namen ein "c" setzt - um dem Programm mitzuteilen, dass es ein Charakter ist.
Beispiel: cDave.Say ("Irgendwas");
Say Das ist der Befehl, den man der handelnden Person gibt. In dem Fall (Say) wird der Person befohlen, etwas zu sagen.
("...") Die zwei ersten Bestandteile des Befehls reichen in einigen Fällen aus, doch nicht in diesem. Wir haben zwar der Figur befohlen, etwas zu sagen, aber noch nicht, was. Das steht jetzt hier in der Klammer. Die Anführungszeichen zeigen dem Programm nur, dass es ein Text ist, der dargestellt werden muss, sie selbst werden nicht angezeigt.

So... Damit haben wir die drei Bestandteile eines objektorientierten Befehls kennen gelernt. Noch ganz wichtig:
Zwischen dem handelndem Objekt und dem Befehl muss ein Punkt stehen...
...und nach jedem Befehl muss ein Semikolon (;) stehen, damit das Programm weiß, dass es zum nächsten Befehl übergehen kann.

Nun ja. Ist ja alles schön und gut. Aber woher wollen wir bitte schön wissen, dass das auch wirklich funktioniert?
Wir glauben es erst, wenn wir einen Beweis haben. Den holen wir uns jetzt.

Wir speichern unser aktuelles Script, schließen es und beenden ebenfalls den IE (Interaction Editor). Dann gehen wir entweder auf "File --> Test Game" oder drücken STR + T.
Dann startet unser Spiel und wir können das Ergebnis unserer Arbeit betrachten.

...aber nur ein Satz als Intro ist vielleicht etwas mager. ^^
Deshalb lassen wir ihn jetzt mal... zum Tisch laufen. Wie klingt das?

Dafür brauchen wir aber erst einmal die genauen Koordinaten von der Stelle, an die er laufen soll.

Wie kriegen wir die raus? Abzählen dauert irgendwie zu lange.
Aber wir haben ja eine Maus... ^^

Wir fahren mit der Maus im Raum an die Stelle wo Bernard hinlaufen soll und klicken mit der rechten Maustaste. Wir können die Koordinaten nun in der Zwischenablage speichern.
Die Koordinaten werden auch über dem Raum neben "Mouse Pos:" angezeigt. Aber sich die jedes Mal zu merken ist etwas zu viel Arbeit.

Nun öffnen wir den IE (Interaction Editor) wieder und öffnen den Befehl, den wir vorher unter "First Time player enters room" erstellt haben ("run script"). Jetzt können wir weiterarbeiten.
...mit dem Befehl, um den Spieler zu bewegen:

player.Walk (100, 135, eBlock, eWalkableAreas);

Jetzt steht in der Klammer kein Text mehr (wie vorhin), sondern 4 verschiedene Angaben... mit Kommas getrennt. OK, was sollen die bedeuten?

100 X-Koordinate des Punktes wo der SC (Spielercharakter) hinlaufen soll
135 Y-Koordinate des Punktes wo der SC hinlaufen soll
eBlock eBlock befiehlt dem Spiel zu warten, bis die Aktion (in diesem Fall das Hinlaufen zu einer Stelle) ausgeführt wurde, bevor mit dem nächsten Befehl weitergemacht wird. Bei "eNoBlock" läuft das Spiel weiter, ohne darauf zu warten, dass der Spieler am Ziel angekommen ist.
eWalkableAreas Das eWalkableAreas bestimmt, ob der Charakter nur auf den begehbaren Bereichen zum Ziel laufen darf, oder ob er auch auf Bereiche treten darf, auf denen er sonst gar nicht laufen könnte.
Die begehbaren Bereiche des jeweiligen Raumes werden unter dem Menüpunkt "Areas" bestimmt. Mehr dazu kommt im Kapitel "Ein neuer Raum".

Wenn der SC (Spielercharakter) an seinem Ziel angelangt ist, bleibt er in der Richtung stehen, in die er gelaufen ist. Wenn er allerdings zum "Publikum" reden soll, ist es besser, wenn er zu ihm hinschaut. Deshalb lassen wir ihn sich uns noch zuwenden, wenn er am Ziel angelangt ist.

Das geht so:

FaceDirection (player.ID, DIR_DOWN);

FaceDirection Das ist der übliche Befehl, um einen Character bei AGS zu drehen. (Face direction heißt so viel wie Blickrichtung)
player.ID Beim Befehl FaceDirection muss man die Nummer des Charakters angeben, der gedreht werden soll. Mit "player.ID" kann man nun die Nummer des momentanen Spielercharacters abrufen. Will man einen anderen Character steuern, muss man dessen Scriptnamen (Steht in der Characterübersicht direkt neben dem Namen) in Großbuchstaben dorthin schreiben. Das ersetzt die Nummer.
(Wir könnten in diesem Fall also auch genauso "FaceDirection (BERNARD, DIR_DOWN);" schreiben)
DIR_DOWN Das ist die Richtung, in die sich der Charakter drehen soll. DIR_DOWN ist für unten (also Richtung Publikum), DIR_UP ist für oben (bzw. vom Publ. weg), DIR_RIGHT dreht den Charakter nach rechts und DIR_LEFT nach links.

Und dann lassen wir ihn noch etwas sagen... (Z.B. "Jetzt gehts los.")
Dann haben wir vier Befehle da stehen. Erst sagt Bernard etwas, dann geht er zum Tisch, dreht sich wieder zu uns und sagt noch etwas. So soll das jedenfalls aus sehen...
Speichern wir das Ganze, schließen das Script und den IE (Interaction Editor) und schauen uns an, ob auch alles klappt.

Falls ja: Sehr schön. Falls nein: Schaut euch noch mal euer Script genau an. Vielleicht habt ihr ja etwas Falsch geschrieben, ein Komma, eine Klammer ein Semikolon vergessen oder ähnliches. Selbst der kleinste Tippfehler kann zu Problemen führen.

Nun... Ihr habt das Ergebnis unserer Arbeit gesehen. Seid ihr zufrieden? Ja? ...
Ich nicht... wirklich. Ja, Bernard geht dahin, wo wir wollen, er sagt das, was wir ihm sagen, aber... ich finde, das ganze läuft noch etwas zu schnell ab. Er rennt ja gleich nach dem ersten Satz los - und kaum ist er da angekommen, wo wir ihn haben wollen, hat er sich auch schon umgedreht und den zweiten Satz gesagt.
So ein Gehetze ist echt nicht nötig. Lassen wir ihn doch zwischen den einzelnen Befehlen warten.

Schreibt einfach einen Warte-Befehl an die Stellen, an denen er warten soll:

Wait (30);

Wait Der Warte-Befehl.
(x) In der Klammer wird angegeben, wie viele Sequenzen lang das Spiel warten soll.
(40 Sequenzen entsprechen einer Sekunde)

Jetzt verlassen wir den Editor wieder (Speichern nicht vergessen!), schließen den Interaction Editor und testen es noch einmal.
Vielleicht erscheint es euch immer noch zu schnell oder er wartet nun doch zu lang... Kein Problem. Ändert einfach die Werte in den Klammern hinter den "Wait"-Befehlen bis es passt. Programmierarbeit hat viel mit herumprobieren zu tun. ^^

So, wenn alles stimmt, könnte es schon fast fertig sein.
...aber eben nur fast. Damit es ein richtiges Intro wird, muss noch etwas dazu: Es muss übersprungen werden können. Ein Intro sollte nicht aufgezwungen werden. Deshalb müssen wir noch zwei kleine Befehle einfügen. Einen vor... und einen nach dem aktuellen Script.

Das ganze sieht dann am Ende so (oder so ähnlich) aus:

StartCutscene (eSkipESCOrRightButton);
player.Say ("Hallo, MMM-Fans!");
Wait (20);
player.Walk (100, 135, eBlock, eWalkableAreas);
Wait (7);
FaceDirection (player.ID, DIR_DOWN);
Wait (30);
player.Say ("Jetzt geht's los.");
EndCutscene ();

Guuut. Was ist jetzt neu dazugekommen?
Richtig.

StartCutscene Damit wird eine Schnittszene (in diesem Fall das Intro) eingeleitet.
(eSkipESCOrRightButton) In der Klammer steht nun, wie die Szene übersprungen werden kann. In diesem Fall kann sie sowohl mit der rechten Maustaste als auch mit der Escape-Taste übersprungen werden. Die anderen Optionen könnt ihr ja mal durchprobieren. Aber die am häufigsten verwendete ist wohl diese.
EndCutscene (); Der Befehl teilt AGS einfach mit, dass die Szene zu Ende ist, mehr nicht. ^^ Die Klammer wird leer gelassen, weil es dazu nicht viel mehr zu sagen gibt. Aber sie muss trotzdem hin geschrieben werden!

So... Damit haben wir unser Intro. Toll, nicht?
Außerdem habt ihr mit dieser Lektion die allerwichtigsten Grundbefehle zur Steuerung eines Charakters gelernt. Hat doch was.

Vorheriges Kapitel Nächstes Kapitel
 
 
  MMM ist ein freies Fanprojekt basierend auf Maniac Mansion von LucasArts - AGS ist von Indiana Chris Jones  
 
Diese Webseite wurde kostenlos mit Homepage-Baukasten.de erstellt. Willst du auch eine eigene Webseite?
Gratis anmelden