|
setfocus (none) loadroom (karte) |
|
on (click) {   setfocus (last)   beamto (self ; Zielraum ; 12 ; 27 ; 1) } |
|
on (loop1) {   setlight (raum ; 50 ; 50 ; 50)   wait (1)   setlight (raum ; 210 ; 150 ; 50)   wait (0,1) } |
|
on (loop2) {   follow (mitlaufcharacter ; self)   wait (1) } |
|
on (loop2) {   if_num (talknumber ; 0)   {     speech (figur1 ; Dialogtext 1)     setnum (talknumber ; +1)     wait (2)   }   if_num (talknumber ; 1)   {     speech (figur2 ; Dialogtext 2)     setnum (talknumber ; +1)     wait (2)   }   if_num (talknumber ; 2)   {     speech (figur1 ; Dialogtext 3)     setnum (talknumber ; +1)     wait (2)   } } |
|
on (use) {   taskbar (false)   setfocus (none)   loadroom (keypad) } |
|
on (enter)   setnum (click_count ; 1) |
|
on (mouse)   showinfo(Ziffer 1 ; false) on (click) {   playsound (click)   if_num (click_count ; 1)     setnum (ziffer1 ; 1)   if_num (click_count ; 2)     setnum (ziffer2 ; 1)   if_num (click_count ; 3)     setnum (ziffer3 ; 1)   setnum (click_count ; +1) } |
|
on (loop1)   if_num (click_count ; 4)   {     setnum (click_count ; 5)     if_num (ziffer1 ; 3)       if_num (ziffer2 ; 7)         if_num (ziffer3 ; 2)           {           cutscene (richtig)           break()           }     cutscene (falsch)   } |
|
setfocus (last) taskbar (true) |
|
if_bool (flashlighton ; true)   setobj (flashlight ; 1) if_bool (flashlighton ; false)   setobj (flashlight ; 0) setnum (posx ; [mousex]) setnum (posx ; -50) setnum (posy ; [mousey]) setnum (posy ; -50) moveobj (flashlight ; 0+[posx] ; 0+[posy] ; 0) |
| setnum (zahl1 ; +[zahl2]) |
| setnum (zahl1 ; [zahl2] - [zahl3] * 3) |
|
if_num (zahl1 ; >20) oder if_num (zahl1 ; <[zahl2]) |
| offspeech (10 ; 3 ; Punktestand : [score]) |
|
setstring (room ; firstroom) setnum (red ; 120) setnum (green ;200) setnum (blue ; 25) setlight ( [room] ; [red] ; [green] ; [blue] ) |
|
timer (sekunden)   cutscene (irgendwas) |
Zum einen ist da der Character an sich. Wenn ihr ganz genau hier links auf die Füße schaut werdet ihr die Unstimmigkeit sehen können an den Fersen. In der Regel ist das nicht weiter tragisch und fällt kaum auf.Der Bodenspiegel-Effekt wird nach den "HINTEN" Objekten dargestellt. Wollt ihr also zum Beispiel einen Teppich auf den Boden legen, dann fügt ihn als Objekt mit dem Status "MITTE" in den Raum ein. Der Character läuft darüber die Spiegelung aber wird verdeckt. |
Habt ihr im Bereich des spiegelnden Bodens auch Objekte stehen, welche selber sich im Boden spiegeln, müsst ihr die Spiegelung seperat als Objekt so wie auch den Teppich hinzufügen, damit der Character sich nicht darauf spiegelt.Wenn ihr darüber hinaus auch bewerkstelligen wollt, das die Figur über diese Fläche wo sich das Objekt spiegelt, gehen kann, müsst ihr zusätzlich noch mit Walkmapskripten das Spiegelobjekt aus- und anzuschalten, so das die Figur sich in dem Bereich spiegelt wenn sie VOR dem Objekt steht oder eben die Spiegelung überdeckt wird wenn die Figur HINTEN dem Objekt steht. Am einfachsten ist es natürlich soetwas von vorne rein zu vermeiden indem man keine stehenden Objekte auf eine Bodenspiegelfläche stellt ;) Um im Bodenspiegel auch Türen die sich öffnen zu sehen benutzt ihr dann Objekte mit dem Status hinten. |
Ihr habt beim Wandspiegel die Möglichkeit die X Position der Spiegelung von der Raumposition abhängig zu machen. Dies ist auf jeden Fall empfohlen das es echter aussieht. Da der Character in die Ferne kopiert wird ist es notwendig das die Tiefenmap nicht an der unterseite der Wand aufhört sondern bis ganz nach oben geht. Ansonsten würde der Character nicht verkleinert gespiegelt werden. Ein Wandspiegel FX-Shape besitzt wie ein Objekt mit der Darstellungsart "Mitte" einen Mittelpunkt der verändert werden kann. Dieser muss dort palziert werden wo die Figur am nächsten an den Spiegel herantreten kann. Wenn die Spiegelungen euch zu weit oben erscheinen setzt diesen Mittelpunkt weiter nach unten. Kleine Korrekturen können mit der Positionseinstellung vorgenommen werden, welche ihr unten links im Raumfenster seht wenn FX-Shapes aktiviert sind. Gespiegelt wird immer das Gegenstück zur aktuellen Aktion des Characters. Steht er nach vorne schauend und redet wird er im Spiegel nach hinten schauen und reden (sofern vorhanden). Bei den Extra-Animationen wird ein Character immer mit Ansicht von hinten gespiegelt, da es ja keine Gegenstücke zu den Extra-Animationen gibt. Ihr solltet also zusätzliche Animationen nicht vor einem Wandspiegel ablaufen lassen. Dürfte doof aussehen. Um etwas auf einen Wandspiegel zu setzen (zum Beispiel eine Aufschrift) müsst ihr dies als Objekt mit der Darstellungsart "Mitte" auf den Spiegel setzen. Der Mittelpunkt dieses Objektes muss auf gleicher höhe mit dem des Wandspiegeleffektes sein, damit das Objekt genau zwischen Figur und Spiegelung steht. |
Wie hier im Bild zu sehen läßt sich durch eine solche Barriere ein Wetter Effekt an bestimmten Stellen ausgrenzen. Um den Effekt optisch richtig zu gestalten, sollte das FX Shape etwas größer als die tatsächliche Begrenzung in der Grafik sein. Zusätzlich kann noch die Darstellung der Partikel mit dem Befehl "Particleview" so geändert werden das noch ein Objekt mit dem Status "VORNE" an dieser Stelle plaziert wird damit man nicht direkt sieht wie ein Partikel einfach verschwindet, sondern er läuft nicht sichtbar hinter das Objekt.
|
|
Wenn Adventure aufwendiger und länger werden, wird auch meistens mehr Skriptaufwand betrieben. Kommt es vor das ein paar Skriptzeilen öfter als an einer Stelle im Spiel verwendet werden, ist es hilfreich eine Skript-Funktion zu nutzen und sich das stetige rumkopieren dieser Zeilen zu sparen. Wie funktioniert das? Eine Funktion ist ein erstelltes Skript das mit dem Befehl function (skriptname) ausgeführt wird. Im Gegensatz zu einer Cutscene läuft das Spiel aber normal weiter. Eine Funktion ist eher für Berechnungen gedacht als für Spielereignisse. Beispiel : Ihr habt in eurem Spiel rollenspieltypische Werte wie HP und MP untergebracht. Diese Werte werden ja im ganzen Spiel verändert. Will man nun das die Anzeige dieser Werte eine entsprechende Farbe hat (rot = wenig, blau = viel) muss man ein paar Berechnungen durchführen um den richtigen Farbwert zu erhalten (Das Downloadbare Beispiel "Textout Demo" zeigt dies) Um diese Berechnungen nun nicht überall dort wo die Werte verändert werden mit einbringen zu müssen, schreibt man sie einfach in ein Skript rein und muss sich anschließend nur noch mit function (textcolor) ausführen. Loopende Funktionen : Will man einen Skriptteil haben der sich im ganzen Spiel raumunabhängig wiederholt wiederholt, musste man auf das Hauptskript zurückgreifen. (siehe z.B das Taschenlampentutorial) Soll so ein Teil aber nicht das ganze Spiel über ablaufen musste man solche Passagen bisher im Hauptskript durch eine Variable ausklammern. Der Nachteil : Wenn es mehrere solcher Teile wurden, war das Hauptskript schnell voll damit. Die Lösung ist eine loopende Funktion : function (skriptname ; infinitly) läßt eine Funktion sich solange wiederholen bis man sie mit stopfunction wieder anhält, was wesentlich eleganter ist. In eurem Spiel könnte es vorkommen das ihr einen Character per Aufzug oder einer Platform von einem Ort zum anderen bewegen wollt. Der Knackpunkt hierbei ist es ja das eure Figur sich selber dabei nicht bewegen soll, sie soll also getragen werden und nicht gehen. Für so ein Vorhaben gibt es seit Version 2.7.3 die Befehle Linkchar und Unlinkchar, welche es ermöglichen eine Figur mit einem Objekt zu verknüpfen, bewegt sich das Objekt (per MOVEOBJ) bewegt sich der Character mit führt aber keine Animationen aus. Er kann während er gelinkt ist auch nicht vom Spieler bewegt werden. Was ihr dabei beachten solltet : Damit ein Character nicht nach hinten zoomt, also kleiner wird wenn er von einem Aufzug Objekt nach oben getragen wird verwendet den Befehl stopzooming. Während eine Figur von einem Objekt "getragen" wird ist es egal ob die Walkmappunkte über die sie sich bewegt frei sind oder nicht, ABER : An dem Punkt wo euer Character steht wo ihr ihn mit unlinkchar wieder frei gebt muss der Walkmappunkt schon frei sein, sonst hängt er fest. Zum Betrachten eines Beispiels seht euch den 8. Raum der Funktionsdemo an. Um in einem Adventure die Spiellaufzeit messen zu können, könnt ihr folgendes machen. Erstellt ein Skript mit dem Namen "gameclock" und füllt es hiermit :
Es ist wichtig das ihr diese Variablen nicht second oder minute nennt weil diese feste Variablen für die Systemzeit sind. Ins Startskript kommt folgendes um die Werte auf 0 zu setzen :
Um die aktuelle Spielzeit anzuzeigen : textout (1 ; Spielzeit : [hours]:[minutes]:[seconds] ; x ; y... ect) Diese Zeitmessung kann nun ein- und ausgestellt werden mit : function (gameclock ; infinity) und stopfunction (gameclock) Um Ereignisse von der Spielzeit abhängig zu machen fragt einfach die Variablen ab... if_num (hours ; >1) z.B läßt etwas nach 2 Stunden Spielzeit passieren. - Schaltet im Projektsetup die standard Aktionszeile aus. - Dort wo eure eigene Zeile sein soll, setzt eine Textoutzeile (direkt im Startskript) welche die Variable [actiontext] beinhalten muss. - Bindet die Textoutzeile ggfs, dort wo ihr sie haben wollt und passt sie an. - Verwendet den Befehl textalign auf Wunsch um die Zentrierung der Zeile zu ändern. (Die standard Aktionszeile ist ja auch mittig.) In Gegenständen, Objekten und Charaktern kann man pro einzelnem Frame einer Animation eine Skriptzeile eingeben. Die einfachste Verwendung dieser Skriptzeilen wäre das Abspielen einer Sounddatei zu einem bestimmten Zeitpunkt der Animation. Hierfür gibt es eine einfach Möglichkeit : Einfach eine Sounddatei direkt auf einen Frame per Drag&Drop ziehen und es wird automatisch ein Playsound Befehl erstellt. Weitere Einsatzmöglichkeiten : Ein Objekt färbt sich selbst um mittels setobjlight, ein Charakter erzeugt bei seinen Schritten Erschütterungen mit jiggle oder ein Objekt bewegt sich mit moveobj selbsttätig durch die Gegend. Generell gilt : Wird, als Beispiel, die Farbe eines Objektes im Zustand 2 wechselnd geändert muss im ersten Frame des Zustands 1 dafür gesorgt werden das die Farbe wieder auf den Ursprung gesetzt wird, da nicht bestimmt werden kann zu welchem Zeitpunkt in einer ablaufenden Animation der Zustand gewechselt wurde. Objekte Bewegen : Mit dem Befehl Moveobj könnt ihr Objekte in eine Richtung ziehen lassen. Mit if_xobj und if_yobj könnt ihr die aktuelle Position abfragen. Tastatur abfragen : Mit dem Befehl if_keydown und if_keypressed kann die Tastatur für Minigames mit verwendet werden. Objekt Gruppen : Mit dem Befehl group lassen sich bis zu 20 Objekte zu einer Gruppe verbinden. Dieser Gruppenname kann dann mit setobj und moveobj verwendet werden um alle Objekte in einer Gruppe auf einmal zu bewegen oder zu verändern. |