Wenn ein Spieler die Maus über ein Objekt bewegt, wird seine Beschreibung aktualisiert, um die Namen der Objekte anzuzeigen, die sich unter diesem Objekt befinden.
Diese Anleitung für Fortgeschrittene setzt Grundkenntnisse der Lua-Skripterstellung voraus.
Es kann nützlich sein zu wissen, was sich unter einem Objekt befindet, ohne das Objekt zu bewegen, um es zu überprüfen. Zum Beispiel ein Stapel Spielsteine in einem Kriegsspiel oder jeder andere Stapel Spielsteine.
Diese Funktion verwendet die Funktion onObjectHover() in der TTS-API. Wenn der Spieler die Maus über ein Objekt bewegt, aktualisiert diese Funktion die Beschreibung dieses Objekts, um die Namen der Objekte unter diesem Objekt aufzulisten. Die Liste wird am Ende jeder Beschreibung hinzugefügt, die bereits an das Objekt angehängt ist.
Diese Funktion ruft Funktionen aus der Lua-String-Bibliothek auf, die viele interessante Funktionen enthält. Sie können mehr darüber im String-Bibliothek-Tutorial im Lua-Users-Wiki lesen.
Diese Funktion funktioniert am besten, wenn Sie die Objekte in Ihrem Spiel identifizieren können, wie z. B. die Tag-Funktionen in der TTS-API. Außerdem müssen die Objekte Namen oder andere Informationen haben, die der Beschreibung hinzugefügt werden können.
Die Funktion
function onObjectHover(player, obj) if obj and obj.hasTag("Hover") then local descrip = obj.getDescription() or '' local start = descrip:find('stacked with') if start then descrip = descrip:sub (1, start-1) end local hitObjects = { } local stackObjects = { } local pos = obj.getPosition() pos.y = pos.y + 2 hitObjects = Physics.cast({origin = pos, direction = {0 ,-1,0}}) for _, hitobj in ipairs(hitObjects) do if obj ~= hitobj.hit_object and hitobj.hit_object.hasMatchingTag(obj) then table.insert(stackObjects, hitobj.hit_object) end end if #stackObjects >0 dann wenn descrip ~= '' und nicht descrip:endsWith('\n') then descrip = descrip..'\n' end descrip = descrip..'stacked with\n' for _, stackobj in ipairs(stackObjects ) do local name = stackobj.getName() or '' descrip = descrip .. name .. '\n' end end if descrip:endsWith('\n') then descrip = descrip:sub(1, -2) end obj.setDescription(decrip) Ende Ende
Was die Funktion macht
Die Funktion:
- Überprüft, ob sich die Maus gerade über einem Objekt befindet („if obj …“). Ohne dies kann die Funktion einen Fehler ausgeben.
- Überprüft, ob das Objekt ein bestimmtes Tag hat. Sie sollten hier einige Tests durchführen, da diese Funktion wahrscheinlich nur für einige der Objekte in Ihrem Spiel nützlich ist.
- Ruft die Beschreibung des Objekts oder eine leere Zeichenfolge ab, wenn das Objekt keine Beschreibung hat.
- Überprüft, ob die Beschreibung den Schlüsselbegriff „gestapelt mit“ enthält. Sie könnten hier jeden beliebigen Ausdruck verwenden, aber die Funktion funktioniert, indem sie nach diesem Schlüsselsatz sucht, also muss der Ausdruck konsistent sein und etwas sein, das sonst nicht in der Beschreibung eines Objekts erscheinen würde.
- Wenn die Beschreibung den Schlüsselsatz „gestapelt mit“ enthält, wird dieser Satz und alles, was danach kommt, gelöscht. (Diese Informationen werden später wieder hinzugefügt.)
- Ruft die Position des Objekts ab.
- Identifiziert jedes andere Objekt abwärts von einem Punkt etwas oberhalb des Objekts und fügt diese Objekte in eine Tabelle namens hitObjects ein.
- Überprüft jedes Objekt in hitObjects. Wenn das Objekt nicht das erste Objekt ist und wenn das Objekt ein Tag hat, das mit dem ersten Objekt übereinstimmt, wird das Objekt einer Tabelle namens stackObjects hinzugefügt.
- Überprüft, ob sich etwas in der Tabelle stackObjects befindet, und wenn ja:
Fügt der Beschreibung des ersten Objekts eine neue Zeile hinzu (falls die Beschreibung bereits Text enthält),
fügt der Beschreibung des ersten Objekts den Schlüsselsatz „gestapelt mit“ hinzu, und
Ruft den Namen jedes Objekts in stackObjects ab, fügt ihn der Beschreibung des ersten Objekts hinzu und fügt eine neue Zeile hinzu. - Löscht die neue Zeile vom Ende der Beschreibung des ersten Objekts, falls vorhanden.
- Legt den Text der Beschreibung des ersten Objekts fest.
Die String-Bibliotheksfunktionen
Kurz gesagt, das machen die Funktionen aus der String-Bibliothek.
start = descrip:find('stacked with') prüft, ob eine String-Variable, descrip, den Ausdruck „stacked with“ enthält, und wenn ja, gibt es den Index des Anfangs dieses Ausdrucks zurück. In diesem Fall ist der Index der n-te Buchstabe in der Beschreibung, an dem das „s“ in „stacked with“ erscheint. Diese Nummer wird der Variablen start zugewiesen.
descrip = descrip:sub(1, start-1) Wenn start nicht nil ist (dh wenn der Ausdruck „stacked with“ in descrip vorkommt), dann gib einen neuen String zurück, der alles in descrip bis einschließlich Index enthält Anfang. Am Ende wird eins abgezogen, sodass der erste Buchstabe von „gestapelt mit“ nicht enthalten ist. Diese neue Zeichenkette wird der Variablen descrip zugewiesen und ersetzt sie.
nicht descrip:endsWith('\n') Die Funktion endedWith() befindet sich nicht in der Lua-String-Bibliothek, sondern ist Teil der Moonsharp-Bibliothek, die TTS verwendet. Es gibt true zurück, wenn eine Zeichenfolge mit einer bestimmten Phrase endet. Hier wird geprüft, ob descrip bereits eine neue Zeile am Ende hat, bevor eine hinzugefügt wird.
descrip:sub(1, -2) Die Funktion endet manchmal mit einer zusätzlichen neuen Zeile am Ende der Objektbeschreibung, was seltsam aussieht. Wenn also descrip mit einer neuen Zeile endet (und nichts danach), gibt descrip:sub(1, -2) einen neuen String zurück, der alles in descrip bis einschließlich der letzten beiden Buchstaben des Strings enthält (dh '\ n') und weist es der Variablen descrip zu.
Beachten Sie, dass lua nichts aus einer Zeichenfolge löscht, sondern eine neue Zeichenfolge zurückgibt, die nicht das enthält, was Sie löschen möchten.
Physik.cast()
Diese Funktion der TTS-API gibt eine Tabelle aller Objekte zurück, die in einem bestimmten Gebiet oder einer bestimmten Richtung vorhanden sind. Es kann viele Dinge tun.
Hier werden hauptsächlich die Standardparameter verwendet, um eine Linie von dem Objekt, über dem die Maus schwebt, nach unten zu ziehen. Dazu hilft es, den Ursprung der Linie auf den Wert 2 über dem Objekt selbst zu setzen. Dies scheint am besten zu funktionieren, um alles im Stapel zu erfassen.
Physics.cast() wird vollständig in der TTS-API-Referenz beschrieben. Es könnte wahrscheinlich verwendet werden, um Objekte zu identifizieren, die ein bestimmtes Objekt umgeben (eher als darunter), aber diese Anleitung ist auf Linien beschränkt, die von einem Objekt nach unten geworfen werden.
Beachten Sie, dass Physics.cast() jedes abgefangene Objekt identifiziert, einschließlich des Spieltisches und anderer zufälliger Objekte.
Aus diesem Grund überprüft die Funktion obj ~= hitobj.hit_object, um zu vermeiden, dass obj in ihre eigene Beschreibung aufgenommen wird.
Außerdem ist es notwendig, einen Test einzuschließen, um nur bestimmte Objekte in die Tabelle stackObjects aufzunehmen. Hier wird das Objekt aufgenommen, wenn es ein Tag hat, das mit dem ersten Objekt übereinstimmt.
Problemlösung
Diese Funktion fügt die Namen der anderen Objekte zur Beschreibung des ersten Objekts hinzu. Wenn die Objekte in Ihrem Spiel keine Namen haben, verwenden Sie andere Informationen und ersetzen Sie den Aufruf der Funktion getName().
Diese Funktion belässt (dh löscht nicht) die Liste der Objekte in der Beschreibung des ersten Objekts.
Dies sollte normalerweise kein Problem darstellen, da die Beschreibung nur angezeigt wird, wenn die Maus über das Objekt bewegt wird. Und als erstes prüft die Funktion (beim Bewegen der Maus über ein Objekt in der entsprechenden Gruppe), ob die Beschreibung den Schlüsselbegriff „gestapelt mit“ enthält. Wenn dies der Fall ist, löscht die Funktion diesen Satz und alles, was danach kommt.
Wenn die Maus also jemals über einem Objekt in der relevanten Gruppe schwebt und sich kein relevantes Objekt darunter befindet, setzt die Funktion die Beschreibung des Objekts zurück.
Wenn dies zu einem Problem wird, hinterlassen Sie bitte einen Kommentar und vielleicht kann die Funktion korrigiert werden, um dies zu vermeiden.
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.