Anstatt eine Schaltfläche zum Auslösen einer Skriptaktion zu verwenden, simulieren Sie die Brettspielumgebung, indem Sie eine Skriptaktion auslösen, indem Sie eine Spielfigur auf eine Kachel legen.
Diese Anleitung für Fortgeschrittene setzt Grundkenntnisse der Lua-Skripterstellung voraus.
Normalerweise verwendet ein Mod eine Schaltfläche, um eine Skriptaktion auszulösen. Das funktioniert gut, passt aber nicht zu TTS als Simulation eines Brettspiels.
Ein anderer Ansatz ist die Verwendung einer benutzerdefinierten Kachel oder eines benutzerdefinierten Tokens. Der Spieler kann eine Skriptaktion auslösen, indem er eine bestimmte Spielfigur auf die Kachel legt.
Grundlegender Ansatz
Dieser Ansatz verwendet die Funktion onCollisionEnter(). Wenn diese Funktion in dem der Kachel beigefügten Objektskript enthalten ist, wird sie jedes Mal aufgerufen, wenn eine Spielfigur die Kachel berührt.
Die Funktion onCollisionEnter() muss sich im Objektskript für die Kachel befinden. Es funktioniert nicht, wenn es sich im globalen Skript befindet.
Eine einfache Funktion sieht so aus:
function onCollisionEnter(collision_info) --collision_info table: --collision_object Object --contact_points Table {Vector,...} --relative_velocity Vector local piece = 'guidaa' -- die Guid des Teils, das die Aktion auslöst local guid = Collision_info .collision_object.getGUID() if guid == piece then return Global:call('desiredAction') -- Stringname der aufzurufenden Funktion end end
Beachten Sie, dass die Funktion jedes Mal aufgerufen wird, wenn ein Objekt mit der Kachel in Kontakt kommt. Daher muss der erste Schritt der Funktion darin bestehen, zu prüfen, ob das Objekt, das den Kontakt herstellt, dasjenige ist, das die Aktion auslösen soll.
Anstatt die GUID zu verwenden, um das Objekt zu identifizieren, das den Kontakt herstellt, könnten Sie den Namen, die Beschreibung oder gmnotes des Objekts verwenden, indem Sie getName(), getDescription() oder getGMNotes() anstelle von getGUID() verwenden.
Unterschiedliche Teile lösen unterschiedliche Aktionen aus
Um diesen Ansatz noch einen Schritt weiter zu führen, könnten Sie verschiedene Spielsteine aufstellen, die unterschiedliche Aktionen auslösen, wenn sie auf die Kachel gelegt werden.
Verwenden Sie eine Funktion wie diese:
function onCollisionEnter(collision_info) local piece = {['guidaa'] = 1, ['guidbb'] = 2, ['guidcc'] = 3} -- Guids als Schlüssel in der Tabelle sind einfacher zu überprüfen local guid = Collision_info. Collision_object.getGUID() local somedata -- somedata zur Weitergabe an das globale Skript, -- z. B. die auszulösende Aktion -- include somedata als Werte in piece{} if piece[guid] then somedata = piece[guid] -- pass somedata zum globalen Skript return Global:call('desiredAction', {somedata}) end end
Lösen Sie verschiedene Aktionen nach platziertem Standort aus
Weitergehend könntest du das Plättchen auch so einrichten, dass der Spieler verschiedene Aktionen auslösen kann, indem er eine Spielfigur an verschiedenen Stellen auf dem Spielplättchen platziert.
Beispielsweise könnten Sie das Bild für die Kachel so gestalten, dass es in vier Quadranten unterteilt wird.
Diese Funktion löst unterschiedliche Aktionen aus, je nachdem welcher Quadrant der Kachel berührt wird.
function onCollisionEnter(collision_info) local piece = 'guidaa' -- Kurzreferenz zum kontaktierenden obj local obj = Collision_info.collision_object local guid = obj.getGUID() local somedata if guid == piece then -- findet den Mittelpunkt zwischen Kontaktpunkten local hit1 = self.positionToLocal(obj.contact_points[1] or obj.contact_points[3]) local hit3 = self.positionToLocal(obj.contact_points[3] or obj.contact_points[1]) – verwenden Sie 'or', falls die Stück ist nicht vollständig auf der Kachel local hitx = (hit1.x+hit3.x)/2 local hitz = (hit1.z+hit3.z)/2 -- normalerweise könnte man die Kachel mit x und in Viertel teilen z-Koordinaten if hitz < 0 then if hitx > 0 then somedata = 1 else somedata = 2 end else if hitx > 0 then somedata = 3 else somedata = 4 end end -- sende somedata an das globale Skript return Global:call('desiredAction ', {guid, somedata}) end end
Dieser letzte Schritt kann schwierig sein, da es nicht immer intuitiv ist, wie die x-, y-, z-Koordinaten in TTS bestimmt werden. Beispielsweise kann es davon abhängen, wie die Kachel gedreht oder gespiegelt wird. Möglicherweise müssen Sie ein wenig experimentieren. Sie könnten der Funktion die Zeile log(hitx..“ „..hitz) hinzufügen, um die Werte beim Experimentieren an die Konsole auszugeben.
Variation
Der Zweck des hier beschriebenen Ansatzes besteht darin, eine Spielaktion auszulösen, wenn ein Spieler einen relevanten Stein auf die Kachel legt. Aus diesem Grund verwendet dieser Ansatz die Funktion onCollisionEnter().
Wenn Sie stattdessen möchten, dass die Funktion nur aktiviert wird, wenn sie im Skript aufgerufen wird, können Sie einen etwas anderen Ansatz verwenden. Sie möchten beispielsweise, dass das Skript eine Option überprüft, die ein Spieler ausgewählt hat. Der unten verlinkte Leitfaden beschreibt diesen Ansatz.
Problembehandlung
Die Funktion onCollisionEnter() kann mehrfach ausgelöst werden, wenn eine Figur gegen die Kachel stößt. Eine Lösung dafür besteht darin, das Auslösen der Funktion zu vermeiden, wenn seit dem letzten Kontakt mit der Kachel nicht genügend Zeit vergangen ist. Fügen Sie dazu diesen Code am Anfang der Funktion ein.
if Time.time - (Sekunden oder 0) < 1 dann zurück sonst Sekunden = Time.time end
Beachten Sie, dass die Variable für Sekunden eine globale Variable sein muss. Wenn dies nicht der Fall ist, kann es bei jedem Aufruf der Funktion zurückgesetzt werden. Achten Sie auf Konflikte mit anderen globalen Variablen.
Das ist alles, was wir heute dafür teilen Tabletop Simulator führen. Dieses Handbuch wurde ursprünglich erstellt und geschrieben von Carey McDuff. Falls wir dieses Handbuch nicht aktualisieren, finden Sie das neueste Update, indem Sie diesen folgen Link.