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.
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.
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:
Flags:
Folgendes solltet Ihr setzen, müsst aber nicht:
Als nächstes erstellen wir (in meinem Fall sind es 4 Stockwerke) 4 path_track's. Diese müssen die folgenden Einstellugen haben:
Wenn Ihr fertig seid, sollte es ungefähr so aussehen:
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:
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:
Der logic_compare muss nun getriggert werden. Dies muss auf zwei Arten passieren:
Also wieder zu den path_track's, diese bekommen nun folgende Outputs:
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.
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:
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).
Flags:
Outputs:
Achtung: Es gibt noch einen Input „SetValueCompare“, der aber
anscheinend nicht genauso funktioniert wie "SetCompareValue". Also aufpassen ;)
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.
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:
Flags:
Outputs:
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.
Zwei Probleme sind mir bekannt:
Hier könnt ihr eine Beispielmap downloaden, in der das gesamte Tutorial aufgebaut ist.
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.