In plaats van een knop te gebruiken om een scriptactie te activeren, simuleert u de bordspelomgeving door een scriptactie te activeren door een speelstuk op een tegel te plaatsen.
Deze tussenliggende gids gaat uit van basiskennis van lua-scripting.
Gewoonlijk zal een mod een knop gebruiken om een scriptactie te activeren. Dit werkt goed, maar past niet bij TTS als simulatie van een bordspel.
Een andere benadering is het gebruik van een aangepaste tegel of token. De speler kan een scriptactie activeren door een specifiek speelstuk op de tegel te plaatsen.
Basisbenadering
Deze benadering maakt gebruik van de functie onCollisionEnter(). Als deze functie is opgenomen in het objectscript dat aan de tegel is bevestigd, wordt deze elke keer dat een speelstuk contact maakt met de tegel aangeroepen.
De functie onCollisionEnter() moet in het objectscript voor de tegel staan. Het zal niet werken als het in het globale script staat.
Een eenvoudige functie ziet er als volgt uit:
function onCollisionEnter(collision_info) -- collision_info table: -- collision_object Object -- contact_points Table {Vector, ...} -- relative_velocity Vector local piece = 'guidaa' -- de guid van het stuk dat de actie activeert local guid = collision_info .collision_object.getGUID() if guid == stuk retourneer dan Global:call('desiredAction') -- tekenreeksnaam van de functie die moet worden aangeroepen end end
Merk op dat de functie wordt aangeroepen wanneer een object contact maakt met de tegel, dus de eerste stap van de functie moet zijn om te controleren of het object dat contact maakt het object is dat de actie moet activeren.
In plaats van de guid te gebruiken om het object dat contact maakt te identificeren, kunt u de naam, beschrijving of gmnotes van het object gebruiken met getName(), getDescription() of getGMNotes() in plaats van getGUID().
Verschillende stukken activeren verschillende acties
Om deze aanpak een stap verder te brengen, zou je verschillende speelstukken kunnen instellen die verschillende acties activeren wanneer ze op de tegel worden geplaatst.
Gebruik een functie als deze:
function onCollisionEnter(collision_info) local piece = {['guidaa'] = 1, ['guidbb'] = 2, ['guidcc'] = 3} -- guids als sleutels in de tabel zijn gemakkelijker te controleren local guid = collision_info. botsing_object.getGUID() local somedata -- somedata om door te geven aan het globale script, -- bijv. de actie om te activeren -- neem somedata op als waarden in piece{} if piece[guid] then somedata = piece[guid] -- geef somedata door naar het Globale script retourneer Global:call('desiredAction', {somedata}) end end
Activeer verschillende acties per geplaatste locatie
Verder gaand, zou je de tegel ook zo kunnen instellen dat de speler verschillende acties kan starten door een speelstuk op verschillende plaatsen op de speltegel te plaatsen.
U kunt bijvoorbeeld de afbeelding voor de tegel ontwerpen om in vier kwadranten te worden verdeeld.
Deze functie activeert verschillende acties, afhankelijk van met welk kwadrant van de tegel contact wordt gemaakt.
function onCollisionEnter(collision_info) local piece = 'guidaa' -- verkorte verwijzing naar de contact opnemende obj local obj = collision_info.collision_object local guid = obj.getGUID() local somedata if guid == piece then -- zoek het middelpunt tussen contactpunten local hit1 = self.positionToLocal(obj.contact_points[1] of obj.contact_points[3]) local hit3 = self.positionToLocal(obj.contact_points[3] of obj.contact_points[1]) -- gebruik 'of' als de stuk ligt niet helemaal op de tegel local hitx = (hit1.x+hit3.x)/2 local hitz = (hit1.z+hit3.z)/2 -- normaal gesproken zou je de tegel in vieren kunnen verdelen met de x en z coördineert als hitz < 0 dan als hitx > 0 dan somedata = 1 anders somedata = 2 end else als hitx > 0 dan somedata = 3 else somedata = 4 end end -- geef wat data door aan het Globale script return Global:call('desiredAction ', {guid, somedata}) end end
Deze laatste stap kan lastig zijn, omdat het niet altijd intuïtief is hoe de x,y,z-coördinaten in TTS worden bepaald. Het kan bijvoorbeeld afhangen van hoe de tegel wordt gedraaid of gespiegeld. Misschien moet je een beetje experimenteren. Je zou het regellogboek (hitx..” “..hitz) aan de functie kunnen toevoegen om de waarden naar de console te sturen terwijl je experimenteert.
Variatie
Het doel van de hier beschreven aanpak is om een spelactie te activeren wanneer een speler een relevant stuk op de tegel plaatst. Daarom gebruikt deze benadering de functie onCollisionEnter().
Als u in plaats daarvan wilt dat de functie alleen wordt geactiveerd wanneer deze in het script wordt aangeroepen, kunt u een iets andere benadering gebruiken. U wilt bijvoorbeeld dat het script een optie aanvinkt die een speler heeft gekozen. De onderstaande gids beschrijft die aanpak.
Problemen
De functie onCollisionEnter() kan meerdere keren worden geactiveerd als een stuk tegen de tegel duwt. Een oplossing hiervoor is om te voorkomen dat de functie wordt geactiveerd als er niet genoeg tijd is verstreken sinds er voor het laatst contact met de tegel is gemaakt. Om dit te doen, plaatst u deze code aan het begin van de functie.
als Time.time - (seconden of 0) < 1 dan return else seconds = Time.time end
Merk op dat de variabele voor seconden een globale variabele moet zijn. Als dit niet het geval is, kan het elke keer dat de functie wordt aangeroepen worden gereset. Pas op voor conflicten met andere globale variabelen.
Dat is alles wat we hiervoor vandaag delen tafelblad Simulator gids. Deze handleiding is oorspronkelijk gemaakt en geschreven door CareyMcDuff. Als we deze handleiding niet kunnen bijwerken, kunt u de laatste update vinden door deze te volgen link.