Timers MMM-Seite
  Hotspots
 

So. Jetzt habt ihr ein Intro und wisst, wie man einen Charakter mit dem Script steuert... Zumindest in einem gewissen Rahmen.

Dann können wir ja jetzt mit dem wirklich Wichtigen anfangen.

Wenn ihr eine MMM-Episode oder ein anderes Adventure gespielt habt, ist euch auf jeden Fall eines begegnet: Ein anklickbarer Bereich.
Zum Beispiel... das Bett in Bernards Zimmer. Oder der Computer. Oder die Fenster. Oder die Tür. Oder...
Ach, ihr wisst schon, was ich meine.

Genau so einen anklickbaren Bereich (der in AGS übrigens Hotspot genannt wird) wollen wir jetzt erstellen.
Hm... Aber wie erkläre ich das jetzt? -Ah! Ich habs.
Um zu verstehen, wie so ein Hotspot zu bedienen ist, schauen wir uns am besten einen Funktionierenden an und versuchen zu verstehen, wie er aufgebaut ist. Codemäßig.

Öh... Wie, ihr wisst nicht, wo die Hotspots zu finden sind?
Ups.

Ähm... Hier: (Das Bild dürfte eigentlich für sich selbst sprechen. )

Room Editor -> Areas -> Hotspots

So weit, so gut. Nun. Was sehen wir auf dem Bild?
Es ist nicht mehr das normale Hintergrundbild... Es sind nämlich lauter Flecken drauf.
Nun... Diese Flecken liegen nicht zufällig genau an den Stellen, die man dann im Spiel anklicken kann. Jeder einzelne dieser Flecken markiert nämlich einen Hotspot.
Wir können uns die ganzen Hotspots anschauen, indem wir auf die kleinen Tasten neben "Editing: 1" klicken. Ihr seht: Es nimmt immer der aktuell ausgewählte Bereich Farbe an, außerdem steht der jeweilige Name gleich mit dabei - in einem Kästchen.

So. Das sind die Hotspots.
...aber es steckt noch etwas mehr dahinter. Irgendwo muss noch der Code stehen, der angibt, was passieren soll, wenn einer dieser Bereiche angeklickt wird.

Also gut. Schauen wir uns mal den Code-Schnipsel (bzw. Das Script) einer dieser Hotspots an. Geht zurück zum ersten Hotspot (dem Computer). Wenn er angewählt ist, klickt ihr auf den Knopf "Interaction...".

Das Fenster, das jetzt auftaucht, erinnert doch an den Interaction Editor, in dem wir bereits das Intro erstellt haben, nicht?

Ihr solltet nun sehen können, dass bereits ein Script erstellt wurde. Und zwar unter "any click on hotspot".
Das öffnen wir... und sehen ungefähr das:

if (any_click_move (90, 130, DIR_UP)) {

  if (UsedAction (A_USE)) {
    player.Say ("Der funktioniert im Moment nicht.");
    player.Say ("Ich habe Doors XP installiert.");
  }

  else if (UsedAction (A_LOOK_AT)) {
    player.Say ("Wir beide haben schon eine Menge Adventures erlebt!");
  }

  else Unhandled ();
}

Puh... Das ist jetzt auf den ersten Blick vielleicht verwirrend.
Aber wenn ihr erst einmal den alten Code gesehen habt, werdet ihr froh über die Übersicht dieses Systems sein.
(Eventuell haben ein paar unter euch gerade alten Code vor sich stehen, falls ihr ein älteres Starterpack erwischt habt... Das ist dann natürlich blöd, da viele Befehle anders sind. Aber ihr werdet das Tutorial trotzdem verstehen - schließlich steht der Code auch da oben. :-P)

Fangen wir mal an, den Code auseinanderzunehmen. Machen wir eine Stück-für-Stück-Analyse.

if (*Bedingung*)

Beginnen wir gleich mal beim ersten Wort. "if".
OK, wenn man weiß, dass "if" "falls" heißt, hat man schon eine ungefähre Vorstellung davon, was das Wörtchen bewirken soll.
Mit dem "if" wird überprüft, ob die Bedingung, die in der Klammer dahinter steht, auch erfüllt wurde.

Dazu kommen die geschweiften Klammern:

if (*Bedingung*) {
  *Anweisungen*
}

Das if bewirkt nun also, dass die Anweisungen, die zwischen den geschweiften Klammern stehen, nur ausgeführt werden, wenn die Bedingung, die in Klammern hinter dem "if" steht, erfüllt wurde.
Ist die Bedingung nicht erfüllt, passiert nichts.

Aber... Was ist in diesem Fall die Bedingung?
Schauen wir sie uns einmal an.

any_click_move (90, 130, DIR_UP)

OK. Die Bedingung ist in diesem Fall ein Befehl. Das heißt: Die Anweisungen werden erst ausgeführt, wenn der Befehl, der hinter dem "if" als Bedingung steht, ausgeführt wurde.

Und was bewirkt der Befehl?
Dieser Befehl ist eine Art Mischung aus dem "player.Walk"- und dem "FaceDirection"-Befehl. Er bewirkt, dass der Spieler an die angegebene Stelle hinläuft und sich in die angegebene Richtung dreht. In der Klammer stehen: Die X- und Y-Koordinate des Punkts, zu dem der Spieler laufen soll, und die Richtung, in die er sich wenden soll, sobald er dort angekommen ist (in diesem Fall nach oben, Richtung Computer).

In dem Fall bewirkt das Script also: Bevor irgendetwas anderes passiert, muss der Spieler zum Hotspot hin gelaufen sein und sich zu ihm hingedreht haben.
(Übersetzt: falls (*Hingelaufen*) tue Anweisungen)

Damit haben wir die Bedingung. Jetzt aber zur Anweisung.

if (UsedAction (A_USE)) {
  player.Say ("Der funktioniert im Moment nicht.");
  player.Say ("Ich habe Doors XP installiert.");
}

else if (UsedAction (A_LOOK_AT)) {
  player.Say ("Wir beide haben schon eine Menge Adventures erlebt!");
}

else Unhandled ();

Wenn man alles so weit verstanden hat, wird man gleich merken, dass die Anweisung aus einer weiteren Bedingungsabfrage besteht.
Ein Unterschied besteht jedoch: Hier steht nicht nur ein "if" mit einer Bedingung, geschweiften Klammern und Anweisungen, sondern es wurde gleich eine ganze Kette von Abfragen gebildet.

if (*Bedingung*) {
  *Anweisungen*
}

else if (*Bedingung*) {
  *Anweisung*
}

else *Anweisung*

Das "if" haben wir bereits besprochen. Aber was hat es mit dem "else" auf sich?

Ganz einfach. Das "else" tritt in Kraft, falls die Bedingung, die bei der if-Abfrage davor abgefragt wurde (also bei "if (UsedAction (A_USE))"), nicht erfüllt war.
Konnte die Bedingung nämlich nicht erfüllt werden, wird gleich die nächste Bedingung abgefragt, also die, die hinter dem "else if" steht.

Ist diese Bedingung ebenfalls nicht erfüllt, wird einfach die Anweisung hinter dem letzten "else" ausgeführt.
Da hinter ihr kein "if" steht, muss keine bestimmte Bedingung erfüllt sein, um sie auszuführen.


Ich weiß, momentan klingt das besonders für Leute, die bisher noch nicht programmiert haben, noch sehr verwirrend... aber lasst mich erst noch die einzelnen Bedingungen erklären, die innerhalb dieser Kette abgefragt werden. Dann ergibt das Ganze einen Sinn.

 

Die erste Bedingung:

if (UsedAction (A_USE))

Mit diesem Befehl wird nun abgefragt, was für eine Aktion gerade ausgeführt wird.

In der Klammer steht dann die Aktion, die erwartet wird.

In diesem Fall steht "A_USE" in der Klammer. Das heißt, dass erwartet wird, dass die aktuell vom Spieler ausgewählte Aktion "Benutze..." ist.

Trifft das zu, ist die Bedingung erfüllt, die Anweisungen in den geschweiften Klammern (die ihr mitllerweile selbst verstehen können solltet) werden ausgeführt und das Script ist fertig.

Trifft es nicht zu, werden die Anweisungen übersprungen und es wird gleich die nächste Bedingung, die hinter dem nächsten "else" steht, abgefragt, also:

else if (UsedAction (A_LOOK_AT))

Machen wir gleich da weiter.

Wie wir sehen können, ist der Befehl, der hier als Bedingung steht, der gleiche. Allerdings wird hier eine anderere Aktion erwartet (in der Klammer steht jetzt nicht mehr "A_USE", sondern "A_LOOK_AT").
"A_LOOK_AT" steht für die Aktion "Schau an..."

Das bedeutet für uns:

Falls als Aktion "Schau an..." gewählt wurde, ist die Bedingung erfüllt, die Anweisunge in den geschweiften Klammern hinter der Bedingung (die ihr ebenfalls verstehen sollet) werden ausgeführt und das Script ist fertig.

Falls als Aktion "Benutze..." gewählt wurde, sind wir hier gar nicht angekommen, weil schon die erste Bedingung erfüllt wurde. Wurde die erste Bedingung erfüllt, hat der ganze Rest der Bedingungsabfragenkette nämlich gar keine Bedeutung mehr.

...Aber falls eine ganz andere Aktion gewählt wurde, wie zum Beispiel "Drücke...", wird zum nächsten else übergangen:

else Unhandled ();

Hier muss ich euch die Bedingung nicht erklären, da es keine gibt.
Aber die Anweisung ist neu:

"Unhandled ()" ist lediglich ein Befehl, mit dem ein Standardkommentar für die momentan gewählte Aktion ausgegeben wird.
(Also so etwas wie "Das kann ich nicht bewegen." bei "Drücke...")

Gut. Gehen wir also die einzelnen Fälle durch.

Falls als Aktion "Benutze..." ausgewählt wurde, ist bereits die erste Bedingung der Bedingungskette erfüllt worden und deshalb kann das Script gar nicht bis hierher kommen.

Wurde als Aktion "Schau an..." gewählt, erwies sich zwar die erste Bedingungsabfrage als falsch, die zweite wurde allerdings erfüllt, deshalb konnte das Script wieder gar nicht bis hierher kommen.

Bei jeder anderen Aktion wird nun ein Standardkommentar ausgegeben (Dank dem Befehl "Unhandled ()"), weil für sie keine besonderen Aktionen programmiert worden sind.


Tätärätätä! Damit ist wohl alles so weit erklärt.

Jetzt macht mal selbst einen Hotspot. Zum Beispiel eine zusätzliche Schublade.

Geht so weit mit den Hotspotnummern rauf, bis im Namenskästchen kein vorgegebener Name mehr steht, sondern etwas wie "Hotspot12" (oder so).
Schreibt da nun den Namen rein, den der Hotspot haben soll (wahrscheinlich "Schublade", oder? ), zeichnet ihn mithilfe der Zeichenwerkzeuge, die rechts neben dem Hotspotauswahlfeld zu sehen sind, in den Raum ein, erstellt im Interaction Editor des Hotspots ein "Run-Script" unter "Any click on hotspot" und schreibt dort die passenden Anweisungen rein.

Orientiert euch einfach am Beispiel des Computers... Aber vergesst nicht, andere Koordinaten beim "any_click_move"-Befehl einzutragen. Sonst braucht ihr euch nicht zu wundern, dass der Spieler immer zum Computer hin läuft, obwohl ihr doch auf die Schublade geklickt habt.

In die Klammer des "UsedAction ()"-Befehls kann man folgende Aktionsnamen eintragen:

A_USE "Benutze ..."
A_LOOK_AT "Schau ... an"
A_PUSH "Drücke ..."
A_PULL "Ziehe ..."
A_PICK_UP "Nimm ..."
A_OPEN "Öffne ..."
A_CLOSE "Schließe ..."
A_USE_INV "Benutze ~~~ mit ..."
A_TALK_TO "Rede mit..."

...Funktioniert alles, bis auf den "Rede mit..."-Befehl, denn: Mit Objekten kann man nicht reden. 

 

So. Das war's für diese Lektion. In der nächsten wird dann erklärt, wie man die neue Schublade öffnet und schließt.

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