Wanneer een speler de muis over een object beweegt, wordt de beschrijving bijgewerkt en worden de namen weergegeven van de objecten die zich onder dat object bevinden.
Deze tussenliggende gids gaat uit van basiskennis van lua-scripting.
Het kan handig zijn om te weten wat zich onder een object bevindt, zonder het object te verplaatsen om te controleren. Bijvoorbeeld een stapel fiches in een wargame, of een andere stapel tegels.
Deze functie gebruikt de functie onObjectHover() in de TTS API. Wanneer de speler de muis over een object beweegt, werkt deze functie de beschrijving van dat object bij om de namen van de objecten onder dat object weer te geven. De lijst wordt toegevoegd aan het einde van elke beschrijving die al aan het object is gekoppeld.
Deze functie roept functies aan uit de lua string-bibliotheek, die veel interessante functies bevat. Je kunt er meer over lezen in de stringbibliotheek-tutorial op de lua-users wiki.
Deze functie werkt het beste als je een manier hebt om de objecten in je game te identificeren, zoals de Tag-functies in de TTS API. Ook moeten de objecten namen of andere informatie hebben die aan de beschrijving kan worden toegevoegd.
De functie
function onObjectHover(player, obj) if obj and obj.hasTag("Hover") then local descrip = obj.getDescription() of '' 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}}) voor _, hitobj in ipairs(hitObjects) do if obj ~= hitobj.hit_object en hitobj.hit_object.hasMatchingTag(obj) then table.insert(stackObjects, hitobj.hit_object) end end if #stackObjects >0 then if descrip ~= '' en niet descrip:endsWith('\n') then descrip = descrip..'\n' end descrip = descrip..'gestapeld met\n' voor _, stackobj in ipairs(stackObjects ) do local name = stackobj.getName() of '' descrip = descrip .. name .. '\n' end end if descrip:endsWith('\n') then descrip = descrip:sub(1, -2) end obj.setDescription(beschrijving) end end
Wat de functie doet
De functie:
- Controleert of de muis momenteel over een object zweeft (“if obj …”). Zonder dit kan de functie een fout genereren.
- Controleert of het object een bepaalde tag heeft. Je zou hier wat tests moeten gebruiken, omdat deze functie waarschijnlijk alleen nuttig is voor enkele van de objecten in je spel.
- Haalt de beschrijving van het object op, of een lege tekenreeks als het object geen beschrijving heeft.
- Controleert of de beschrijving de sleutelzin "gestapeld met" bevat. Je zou hier elke zin kunnen gebruiken, maar de functie werkt door te controleren op deze sleutelzin, dus de zin moet consistent zijn en iets zijn dat anders niet in de beschrijving van een object zou voorkomen.
- Als de beschrijving de sleutelzin 'gestapeld met' bevat, verwijdert u die zin en alles wat daarna komt. (Die informatie wordt later weer toegevoegd.)
- Haalt de positie van het object op.
- Identificeert elk ander object naar beneden vanaf een punt iets boven het object, en plaatst die objecten in een tabel met de naam hitObjects.
- Controleert elk object in hitObjects. Als het object niet het eerste object is en als het object een tag heeft die overeenkomt met het eerste object, wordt het object toegevoegd aan een tabel met de naam stackObjects.
- Controleert of er iets in de stackObjects-tabel staat, en zo ja:
voegt een nieuwe regel toe aan de beschrijving van het eerste object (als er al tekst in de beschrijving staat),
voegt de sleutelzin "gestapeld met" toe aan de beschrijving van het eerste object, en
haalt de naam op van elk object in stackObjects, voegt het toe aan de beschrijving van het eerste object en voegt een nieuwe regel toe. - Verwijdert de nieuwe regel vanaf het einde van de beschrijving van het eerste object, indien aanwezig.
- Stelt de tekst van de beschrijving van het eerste object in.
De functies van de tekenreeksbibliotheek
Dit is in het kort wat de functies uit de stringbibliotheek doen.
start = descrip:find('stacked with') controleert of een stringvariabele, descrip, de frase "stacked with" bevat, en zo ja, dan wordt de index van het begin van die frase geretourneerd. In dit geval is de index de n-de letter in descrip waarbij de "s" in "gestapeld met" verschijnt. Dit nummer wordt toegewezen aan de variabele start.
descrip = descrip:sub(1, start-1) Als start niet nul is (dwz als de zin "gestapeld met" wel voorkomt in descrip), retourneer dan een nieuwe tekenreeks die alles in de beschrijving bevat tot en met maar exclusief de index begin. Eén wordt aan het einde afgetrokken, zodat de eerste letter van "gestapeld met" niet wordt opgenomen. Deze nieuwe string wordt toegewezen aan en vervangt de variabele descrip.
not descrip:endsWith('\n') De functie endsWith() bevindt zich niet in de lua string-bibliotheek, maar maakt eerder deel uit van de Moonsharp-bibliotheek die TTS gebruikt. Het retourneert waar als een tekenreeks eindigt met een opgegeven zin. Hier wordt gecontroleerd of descrip aan het einde al een nieuwe regel heeft, voordat er een wordt toegevoegd.
descrip:sub(1, -2) De functie eindigt soms met een extra nieuwe regel aan het einde van de objectbeschrijving, wat er vreemd uitziet. Dus als beschrijving eindigt met een nieuwe regel (en niets daarna), geeft de beschrijving:sub(1, -2) een nieuwe tekenreeks terug die alles in de beschrijving bevat tot maar met de laatste twee letters in de tekenreeks (dwz '\ n'), en wijst het toe aan de variabele descrip.
Merk op dat lua niets van een tekenreeks verwijdert, maar eerder een nieuwe tekenreeks retourneert die niet heeft wat u wilt verwijderen.
Natuurkunde.cast()
Deze functie van de TTS API retourneert een tabel met alle objecten die in een bepaald gebied of in een bepaalde richting bestaan. Het kan veel dingen doen.
Hier gebruikt het voornamelijk de standaardparameters om een lijn naar beneden te werpen vanaf het object waarover de muis zweeft. Voor dit doel helpt het om de oorsprong van de lijn een waarde van 2 boven het object zelf in te stellen. Dit lijkt het beste te werken om alles in de stapel vast te leggen.
Physics.cast() wordt volledig beschreven in de TTS API-referentie. Het zou waarschijnlijk kunnen worden gebruikt om objecten te identificeren die een bepaald object omringen (in plaats van eronder), maar deze gids is beperkt tot lijnen die vanaf een object naar beneden worden geworpen.
Merk op dat Physics.cast() elk object dat het onderschept zal identificeren, inclusief de speeltafel en andere incidentele objecten.
Daarom controleert de functie dat obj ~= hitobj.hit_object, om te voorkomen dat obj in zijn eigen beschrijving wordt opgenomen.
Het is ook nodig om een test op te nemen om alleen bepaalde objecten in de stackObjects-tabel op te nemen. Hier wordt het object opgenomen als het een tag heeft die overeenkomt met het eerste object.
Probleem oplossen
Deze functie voegt de namen van de andere objecten toe aan de beschrijving van het eerste object. Als de objecten in je spel geen namen hebben, gebruik dan wat andere informatie en vervang de aanroep van de functie getName().
Deze functie laat (dwz verwijdert niet) de lijst met objecten in de beschrijving van het eerste object.
Dit zou normaal gesproken geen probleem moeten zijn, omdat de beschrijving alleen verschijnt als de muis over het object zweeft. En het eerste dat de functie doet (wanneer de muis over een object in de relevante groep zweeft) is controleren of de beschrijving de sleutelzin "gestapeld met" bevat. Als dat zo is, verwijdert de functie die frase en alles wat daarna komt.
Dus als de muis ooit over een object in de relevante groep zweeft, en er staat geen relevant object eronder, dan zal de functie de beschrijving van het object resetten.
Als dit een probleem wordt, laat dan een opmerking achter en misschien kan de functie worden gecorrigeerd om dit te voorkomen.
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.