Funkce llSetPrimitiveParams
K čemu by nám byla proměnná, pokud by jsme ji nemohli upravovat, sčítat, porovnávat, přiřazovat, násobit, atp…?
Operátory
matematické a logické operace s hodnotami, zde jsou uvedeny jen ty nejdůležitější:
- float a = a + 6 * 0.5; přiřazení hodnoty, sčítání a násobení, obdobně – či /
- if (a == 8) { příkazy } porovnávání hodnot, obdobně != pro nerovnost, adekvátně <, >, <=, >=
- if ( (a > 1) && (a < 4.3) ) { příkazy } dvojznak || znamená NEBO
dvojznak && znamená A ZÁROVEŇ
Funkce – předdefinované
- několik set funkcí je již součástí LSL, poznáte je podle názvu funkce llNazevFunkce
- v kódu je použiji pomocí jména funkce a vstupních parametrů
- vstupní parametry i výstup mohou být prázdné, např. llOwnerSay (pouze vstup) nebo llGetSunDirection (pouze výstup) či llDie (zcela bez parametrů)
- kompletní seznam funkcí a vstupních / výstupních parametrů je k nalezení na LSLwiki
Funkce – uživatelské
- kromě předdefinovaných funkcí je možné vytvořit i své vlastní podle stejného principu vstup – výstup
- tato technika se používá hlavně na opakovaně používanou sekvenci příkazů
- účelem je úsporný zápis kódu, který je rozdělen do menších a lépe přehledných bloků
- definice uživatelské funkce musí obsahovat jméno funkce, definici vstupních parametrů, sekvenci příkazů a definici výstupní hodnoty, definuje se před state
Kontrola běhu skriptu
existuje několik příkazů, které řídí způsob, jak, kdy a co se ve skriptu vykonává
- state přechod do jiného state
- if … else větvení podle podmínky
- for cyklus s daným počtem opakování
- while cyklus, testování na začátku
- do … while cyklus, testování na konci
state
Již jsem probíral v 1. lekci. Slouží na změnu aktuální state, který vyjadřuje stav objektu
default { touch_start(integer detectedCount) { llOwnerSay( "Přecházím do klik state."); state klik; // po kliknutí na objekt přejde skript do stavu "klik" } } state klik { touch_start(integer detectedCount) { llOwnerSay( "Přecházím do default state."); state default; po opětovném kliknutí na objekt přejde skript do default stavu } }
if … else
Lze vyjádřit jako: pokud je něco pravda, udělej A, v opačném případě udělej B (anebo nic)
default { state_entry() { llSay(0, "Hello, Avatar!"); string Region = llGetRegionName(); if (Region == "Bohemia") { llOwnerSay("Vítej doma."); //pokud si v regionu Bohemia budeš vítán } else { llOwnerSay("Nejsem tady rád."); // jinak nebudeš nikdy rád:-) } } }
for
lze vyjádřit jako: vykonej daný blok příkazů opakovaně X-krát za sebou
default { state_entry() { integer x; list Ovoce = ["jablko", "hruška", "švestka"]; integer length = llGetListLength(Ovoce); for (x = 0; x ‹ length; x++) //pokud je hodnota x menší než velikost proměnné list - cyklus se provede opětovně { llSay(0, llList2String(Ovoce, x)); } } }
while
lze vyjádřit jako: dokud platí podmínka, vykonávej opakovaně blok příkazů
default { state_entry() { vector Slunce = llGetSunDirection(); while( Slunce.z ‹= 0) //pokud je slunce pod horizontem - podmínka se opakuje { llOwnerSay("Čekám na ráno"); llSleep(500); Slunce = llGetSunDirection(); } llOwnerSay("Dobré ráno světe"); } }
do … while
oproti podmínce while proběhne podmínka do…while vždy alespoň 1x, lze ji vyjádřit jako: vykonávej opakovaně blok příkazů, dokud platí podmínka
default { state_entry() { vector Slunce = llGetSunDirection(); do { llOwnerSay("Čekám na ráno"); llSleep(500); Slunce = llGetSunDirection(); } while( Slunce.z ‹= 0) llOwnerSay("Dobré ráno světe"); } }
Related posts