Fahrstühle

Es gibt mehrere Arten Fahrstühle. Der einfachste ist eine Tür, die statt der normalen Türbewegung (seitwärts aufschieben) nach oben und unten fährt. Allerdings kann man mit diesem Türen-Aufzug nur zwei Stockwerke miteinander verbinden.

Um einen „echten“ Aufzug zu erstellen benötigt man einiges mehr an Entities: Einen func_tracktrain, mehrere path_track's, die entsprechenden func_button's (um den Aufzug zu rufen und in ein Stockwerk zu schicken) und einen logic_compare, der entscheidet, wo der Aufzug stehen bleiben soll.

Methode 1: Aufwändiger Fahrstuhl

Grundidee

Wir wollen wie folgt vorgehen: Der Aufzug soll als func_tracktrain an mehreren path_track entlangfahren. Gesteuert wird der Aufzug über Buttons im Aufzug und in den jeweiligen Stockwerken und über einen logic_compare. Die Buttons sagen dem logic_compare dabei immer wohin der Aufzug fahren soll (Compare value), die path_track's sagen dem logic_compare, wo der Aufzug sich gerade befindet (Initial value). Durch den compare der values kann der logic_compare entscheiden, ob der Aufzug hoch (StartForward des func_tracktrain) oder runter (StartBackward) fahren bzw. stehen bleiben (Stop) soll.

Der Aufzug

Als erstes benötigen wir ein Gebäude mit mehreren Ebenen und eine Aufzugskabine. Die Kabine wird dann zu einem func_tracktrain. Folgende Einstellungen sind nötig:

  • Name: Lift (Der Name, mit dem ihr den Lift später ansprecht)
  • First stop target: Stock2 (Der path_track, an dem der Lift starten soll)
  • Height above track: 0 (Wie hoch soll der Aufzug über einem path_track schweben. Mein Aufzug ist exakt ausgerichtet, also 0 units über dem path_track)

Flags:

  • No Pitch (Der Aufzug soll sich nicht drehen)
  • No User Control (Der Aufzug soll nicht wie z.B. ein Zug aus HalfLife 1 steuerbar sein)

Folgendes solltet Ihr setzen, müsst aber nicht:

  • Damage on crush: 50 (Wenn ein Spieler den Lift blockiert, kriegt er diesen Schaden)
  • Move Sound: doors/garage_move1.wav (Mir hat dieser Sound am besten gefallen)

Als nächstes erstellen wir (in meinem Fall sind es 4 Stockwerke) 4 path_track's. Diese müssen die folgenden Einstellugen haben:

  • Name: Stock1 (Die einzelnen path_track's werden durchnumeriert wie die Stockwerke)
  • Next stop traget: Stock2 (Gebt jeweils den nächsten path_track an. Der letzte hat keinen weiteren Stop.)

Wenn Ihr fertig seid, sollte es ungefähr so aussehen:

1.jpg

Wo ist der Aufzug?

Sobald die path_track's erstellt sind, benötigen wir den logic_compare. Dieser wird dafür zuständig sein, dem Aufzug zu sagen, ob er noch weiterfahren soll oder ob er in einem bestimmten Stockwerk stehenbleiben soll. Einstellungen:

  • Name: LogicCompare (Der Name, mit dem der logic_compare referenziert wird)
  • Initial value: 2 (Das Initial value verwenden wir immer, um festzustellen, wo der Aufzug sich gerade befindet. Am Anfang soll dieser im zweiten Stock starten.)
  • Compare value: 2 (Das Compare value wird immer verwendet, um festzustellen, wo der Aufzug hin soll. Am Anfang soll dieser im zweiten Stock starten und bleiben.)

Das logic_compare wird jetzt immer getriggert (bzw. eigentlich „compared“), um den Aufzug nach oben oder unten fahren zu lassen oder um stehen zu bleiben. Das heisst, wir tragen unter Outputs folgendes ein:

  • OnEqualTo - Lift - Stop - 0.00 (Wenn die Werte „Wo bin ich“ und „Wo soll ich hin“ also gleich sind, bleibt der Aufzug namens „Lift“ stehen, und zwar sofort)
  • OnGreaterThan - Lift - StartBackward - 0.00 (Wenn der Wert „Wo bin ich“ grösser ist als der Wert „Wo soll ich hin“, dann muss der Aufzug namens „Lift“ nach unten fahren, und zwar sofort)
  • OnLessThan - Lift - StartForward - 0.00 (Wenn der Wert „Wo bin ich“ kleiner ist als der Wert „Wo soll ich hin“, dann muss der Aufzug namens „Lift“ nach oben fahren, und zwar sofort)

2.jpg

Der logic_compare muss nun getriggert werden. Dies muss auf zwei Arten passieren:

  1. Der Aufzug fährt bereits und wird von jedem path_track an dem er vorbeifährt getriggert
  2. Der Aufzug steht momentan und wird durch einen Spieler anhand eines Buttons getriggert

Vorbeifahrender Aufzug

Also wieder zu den path_track's, diese bekommen nun folgende Outputs:

  • OnPass - LogicCompare - SetValue „1“ - 0.00 (Sobald der Aufzug vorbeifährt, wird der Wert des aktuellen Stockwerks in den LogicCompare Value „InitialValue“ geschrieben)
  • OnPass - LogicCompare - Compare - 0.01 (0,01 Sekunden danach wird der LogicCompare getriggert, d.h. compared)

3.jpg

Wenn der Aufzug also z.B. in Stockwerk 3 vorbeifährt, weiss der locig_compare, in welchem Stockwerk wir uns befinden und kann dementsprechend entscheiden, was der Aufzug tun soll.

Damit der logic_compare aber wirklich weiss, was der Aufzug tun soll, muss er noch wissen, wo der Aufzug hin soll. Dies wiederum teilen wir dem locig_compare über func_button's im Aufzug und in jedem Stockwerk mit.

Die Aufzug-Schick-Schalter

Als erstes erstellen wir die Schalter im Aufzug, mit denen wir den Aufzug in die verschiedenen Stockwerke schicken können. Diese erzeugen wir im Aufzug an einer Aufzugwand und machen diese zum func_button. Das ganze könnte so aussehen: 4.jpg

Nehmt aber nicht wie hier die SpriteTexturen für die Zahlen, sondern macht euch
eine passende eigene Textur, da die Sprites auf Brushes zu visuellen Fehlern führen
(man sieht den Sprite durch alle Mauern durch).
  • Name: ButS1Go (Der Name des Buttons. Ich habe meine Buttons nach dem Schema „But“-Stockwerk-Funktion benannt)
  • Parent: Lift (Dies ist nötig, um den Button immer mit dem Aufzug fahren zu lassen)

Flags:

  • Don't Move (Wenn der Button nicht in der Wand verschwinden soll, klickt dies einfach an)
  • Use activates (Der Button kann nur über den Use-Knopf getriggert werden)

Outputs:

  • OnPressed - LogicCompare - SetCompareValue „1“ - 0.00 (Sobald der Button gedrückt wird, wird der Wert des Stockwerks in das wir fahren wollen in den LogicCompare Value „CompareValue“ geschrieben)
  • OnPressed - LogicCompare - Compare - 0.01 (0,01 Sekunden danach wird der LogicCompare getriggert, d.h. compared)

Achtung: Es gibt noch einen Input „SetValueCompare“, der aber

anscheinend nicht genauso funktioniert wie "SetCompareValue".
Also aufpassen ;)

5.jpg

Dadurch fährt der Aufzug los, sobald wir den Knopf im Aufzug drücken. Der logic_compare sorgt dabei immer dafür, das wir im richtigen Stockwerk anhalten. Nun müssen wir nur noch entsprechende Buttons im Aufzug für die restlichen Stockwerke erstellen und mit den gleichen Werten wie oben versehen (natürlich mit den anderen Stockwerknummern). Nun können wir in jedes Stockwerk fahren.

Die Stockwerk-Ruf-Schalter

Danach möchten wir den aufzug natürlich auch aus jedem Stockwerk rufen können. Die Buttons haben dabei aber das gleiche Output-Schema wie die Aufzug-Schick-Schalter. Also erstellen wir in jedem Stockwerk einen Schalter, der den Aufzug ruft. Erstellt einfach einen Brush, belegt ihn mit einer Knopf-ähnlichen Textur und macht diesen Brush zum func_button mit folgenden Einstellungen:

  • Name: ButS1Call (Der Name des Buttons. Ich habe meine Buttons nach dem Schema „But“-Stockwerk-Funktion benannt)

Flags:

  • Don't Move (Wenn der Button nicht in der Wand verschwinden soll, klickt dies einfach an)
  • Use activates (Der Button kann nur über den Use-Knopf getriggert werden)

Outputs:

  • OnPressed - LogicCompare - SetCompareValue „1“ - 0.00 (Sobald der Button gedrückt wird, wird der Wert des aktuellen Stockwerks in den LogicCompare Value „CompareValue“ geschrieben)
  • OnPressed - LogicCompare - Compare - 0.01 (0,01 Sekunden danach wird der LogicCompare getriggert, d.h. compared)

Türen und ähnliches

Durch diese Konstruktion kann man relativ einfach auch beim drücken des Knopfes im Aufzug eine Fahrstuhltür schliessen und beim „OnEqual“ des logic_compare wieder öffnen. Lasst euch einfach etwas einfallen.

Bekannte Probleme

Zwei Probleme sind mir bekannt:

  1. Der Fahrstuhl ruckelt beim fahren sehr stark. Dies sieht aber nur so aus, wenn man sich IM Fahrstuhl befindet, von aussen sieht die Fahrt schön „weich“ aus. Leider hilft auch ein ändern der Geschwindigkeit nicht wirklich.
  2. Der Fahrstuhl hält in den Stockwerken nicht perfekt, da anscheinend die path_track's in dem Moment getriggert werden, in dem der Aufzug auf den unteren Teil des path_track's trifft. Da es bis zum logic_compare 0.01 Sekunden dauert, hält der Aufzug nicht direkt in der Mitte an.

Beispiel Map

Hier könnt ihr eine Beispielmap downloaden, in der das gesamte Tutorial aufgebaut ist.

Methode 2: Türen-Fahrstuhl

Um dem Fahrstuhl noch Türen hinzuzufügen, reicht es völlig aus, wenn man die Türen als func_door einfach per „Parent“ Eintrag an den Fahrstuhl bindet. So muss man sie nur noch beim Anhalten öffnen, und bei Abfahren wieder schliessen.

Die Verwendung aller Dokumente einschließlich der Abbildungen ausschließlich zu nichtkommerziellen Zwecken. Verbreitung des Dokuments auf Speichermedien, (insbesondere auf CD-ROMs als Beilage zu Zeitschriften und Magazinen oder sog. "Mission-Packs" etc.) ist untersagt.
 
half-life_2/tutorials/fahrstuehle.txt · Zuletzt geändert: 2011/05/24 09:20 von Adrian_Broher