Odpowiedz
Autor Wiadomość
Kobieta
PostWysłany: 08 Maj 2012, 16:54 
Moderator
Awatar użytkownika
Dołączenie:
Luty 2012
Posty: 530
Skąd: Tychy
nick w SL: PanteraPolnocy
Tym razem wstawiam tutaj to proste coś dlatego, że do tej pory widzę całkiem nowe skrypty oświetleniowe hołdujące zasadzie "jedna lampka = jeden skrypt" używające llLinkedMessage lub (o zgrozo) listenerów kanałowych. Skrypt nie jest szczególnie skomplikowany - nie można go nawet wyłączyć, ale dodanie tego to nie problem, wystarczy jeden touch event i zmienna z wyłączeniem/włączaniem polecenia timer().

1. Należy zrobić kuleczkę, która ma reprezentować lampkę. Tutaj najprostsza przedstawicielka tychże: biała, bez tekstury, o wymiarach 0.1 x 0.1 x 0.1.

330

2. Przytrzymując klawisz Shift i ciągnąc za jedną ze strzałek należy skopiować kuleczkę... kilkanaście razy. W tym przykładzie kuleczek ma być w sumie 30, 3 rzędy po 10 kulek.

331

3. Skrypt będzie porozumiewał się z kuleczkami za pomocą nazw obiektów. Należy zaznaczyć pierwszy rząd kuleczek i w polu przeznaczonym na nazwę wpisać cyfrę "1", a następnie pacnąć w Enter. Dla drugiego rzędu - 2. Dla trzeciego - 3.

332

4. Za pomocą przycisku "Scal/Link" należy połączyć primy w jeden obiekt. Będzie on miał nazwę "1", "2" lub "3" - tak jak jedna z kuleczek. Nie należy jej zmieniać.

333

5. Na zakładce "Zawartość/Content" należy utworzyć wewnątrz obiektu jeden nowy skrypt i wkleić do niego zawartość z końca tego posta, a następnie zapisać.

334

6. Na ekranie powinny znajdować się trzy rzędy mrugających lampek, każdy z nich zmieniający od siebie niezależnie kolory, całkowicie losowo. Wygląda to dość schematycznie, a więc teraz trzeba zaznaczyć "Edytuj połączone części / Edit linked parts" i wymieszać kuleczki jedna po drugiej...

335

7. ... lub ustawić na miejscach docelowych. Choince, ścianach dyskoteki, whatever. :P Wszystkim zawiadywać będzie jeden skrypt. Można naturalnie rozlinkowywać zestaw i dodawać nowe lapki, a potem linkować go na powrót.

336

---

A teraz analiza skryptu.
Kolorowa wersja tutaj: http://pastebin.com/dCZ0t82w

Cytuj:
integer i;
integer x;
integer iloscPrim;
float czerwony;
float zielony;
float niebieski;

list jedynki;
list dwojki;
list trojki;
integer ileJedynek;
integer ileDwojek;
integer ileTrojek;

float intensywnoscSwiatla = 1.0; // 0.0 - 1.0
float przezroczystoscLampek = 1.0; // 0.0 - 1.0
float zasiegSwiatla = 15.0; // 0.1 - 20.0
float opadanieSilySwiatla = 1.0; // 0.01 - 2.0
float silaBlasku = 1.0; // 0.0 - 1.0

default {
on_rez(integer start_param) {
llResetScript();
}
state_entry() {
iloscPrim = llGetNumberOfPrims();
for(i = 1; i <= iloscPrim; i++) {
if(llGetLinkName(i) == "1") {
jedynki = [i] + jedynki;
} else if(llGetLinkName(i) == "2") {
dwojki = [i] + dwojki;
} else if(llGetLinkName(i) == "3") {
trojki = [i] + trojki;
}
}
ileJedynek = llGetListLength(jedynki);
ileDwojek = llGetListLength(dwojki);
ileTrojek = llGetListLength(trojki);
llSetTimerEvent(1.0);
}
timer() {

czerwony = llFrand(1.0);
zielony = llFrand(1.0);
niebieski = llFrand(1.0);
x = 0;
while(x < ileJedynek) {
llSetLinkPrimitiveParamsFast(llList2Integer(jedynki, x), [PRIM_POINT_LIGHT, TRUE, <czerwony, zielony, niebieski>, intensywnoscSwiatla, zasiegSwiatla, opadanieSilySwiatla, PRIM_GLOW, ALL_SIDES, silaBlasku, PRIM_COLOR, ALL_SIDES, <czerwony, zielony, niebieski>, przezroczystoscLampek]);
++x;
}

czerwony = llFrand(1.0);
zielony = llFrand(1.0);
niebieski = llFrand(1.0);
x = 0;
while(x < ileDwojek) {
llSetLinkPrimitiveParamsFast(llList2Integer(dwojki, x), [PRIM_POINT_LIGHT, TRUE, <czerwony, zielony, niebieski>, intensywnoscSwiatla, zasiegSwiatla, opadanieSilySwiatla, PRIM_GLOW, ALL_SIDES, silaBlasku, PRIM_COLOR, ALL_SIDES, <czerwony, zielony, niebieski>, przezroczystoscLampek]);
++x;
}

czerwony = llFrand(1.0);
zielony = llFrand(1.0);
niebieski = llFrand(1.0);
x = 0;
while(x < ileTrojek) {
llSetLinkPrimitiveParamsFast(llList2Integer(trojki, x), [PRIM_POINT_LIGHT, TRUE, <czerwony, zielony, niebieski>, intensywnoscSwiatla, zasiegSwiatla, opadanieSilySwiatla, PRIM_GLOW, ALL_SIDES, silaBlasku, PRIM_COLOR, ALL_SIDES, <czerwony, zielony, niebieski>, przezroczystoscLampek]);
++x;
}

}
}


Rozkładając na czynniki pierwsze:

Cytuj:
integer i;
integer x;
integer iloscPrim;
float czerwony;
float zielony;
float niebieski;

Deklaracja typów danych dla zmiennych wewnętrznych wykorzystywanych w skrypcie.

Cytuj:
list jedynki;
list dwojki;
list trojki;
integer ileJedynek;
integer ileDwojek;
integer ileTrojek;

Deklaracja list, w których będą trzymane numery linków poszczególnych lampek oraz zmienne, w których będą przechowywane długości tych list. W tym przykładzie każda z nich będzie mieć wartość 10 (3x10=30), ale gdyby była potrzeba dołożenia lampek jednego typu, a ujęcia drugiego - jak znalazł.

Cytuj:
float intensywnoscSwiatla = 1.0; // 0.0 - 1.0
float przezroczystoscLampek = 1.0; // 0.0 - 1.0
float zasiegSwiatla = 15.0; // 0.1 - 20.0
float opadanieSilySwiatla = 1.0; // 0.01 - 2.0
float silaBlasku = 1.0; // 0.0 - 1.0

Tutaj sobie można pokonfigurować. :P

Cytuj:
default {

...

}

Stan podstawowy. To jak tlen dla ludzi - bez tego skrypt nie żyje.

Cytuj:
on_rez(integer start_param) {
llResetScript();
}

Resetowanie skryptu w pamięci po zrezzowaniu obiektu.

Cytuj:
state_entry() {

...

}

Wszystko co w tej klamerce będzie wykonywane, gdy skrypt załaduje się do pamięci. I tak...

Cytuj:
iloscPrim = llGetNumberOfPrims();

for(i = 1; i <= iloscPrim; i++) {
if(llGetLinkName(i) == "1") {
jedynki = [i] + jedynki;
} else if(llGetLinkName(i) == "2") {
dwojki = [i] + dwojki;
} else if(llGetLinkName(i) == "3") {
trojki = [i] + trojki;
}
}

Na początek skrypt pobiera ilość wszystkich prim w obiekcie. W moim przykładzie będzie to 30. Następnie sprawdza nazwę każdej primy i jeśli ma ona nazwę "1" - wrzuca jej numer linka do listy "jedynki". Analogicznie dla "2" i "3".

Cytuj:
ileJedynek = llGetListLength(jedynki);
ileDwojek = llGetListLength(dwojki);
ileTrojek = llGetListLength(trojki);

llSetTimerEvent(1.0);

Teraz skrypt zlicza ilości prim (lampek) w każdej z list i przypisuje je do zmiennych, a następnie odpala komendę timer(), nakazując wykonanie co jedną sekundę (1.0). Skrypt spokojnie wytrzyma wartość nawet i 0.1, ale wtedy będzie to zbyt oczopląśne. :P

Cytuj:
timer() {

...

}

Komenda timer(), wszystko co w niej wykonuje się co określoną ilość czasu.

Cytuj:
czerwony = llFrand(1.0);
zielony = llFrand(1.0);
niebieski = llFrand(1.0);
x = 0;
while(x < ileJedynek) {
llSetLinkPrimitiveParamsFast(llList2Integer(jedynki, x), [PRIM_POINT_LIGHT, TRUE, <czerwony, zielony, niebieski>, intensywnoscSwiatla, zasiegSwiatla, opadanieSilySwiatla, PRIM_GLOW, ALL_SIDES, silaBlasku, PRIM_COLOR, ALL_SIDES, <czerwony, zielony, niebieski>, przezroczystoscLampek]);
++x;
}

Taki sam blok jest wykorzystywany dla każdej z list, a więc opiszę go tylko dla "jedynek".

Na początku losowane są wartości kolorów podstawowych - czerwony, zielony, niebieski (red, green, blue - RGB). Zmienne mogą przyjmować wartości od 0 do 1. Następnie zmienna "x" jest ustawiana na wartość zero. W pętli while obowiązuje warunek, że dopóki "x" jest mniejszy od "ileJedynek", dopóty kod ma być w niej wykonywany. A skoro "x" jest zerem, a "ileJedynek" (w moim przykładzie) ma wartość 10... pętla leci. W niej za pomocą funkcji llSetLinkPrimitiveParamsFast ustawiane są wszelkie potrzebne wartości dla jednego linka z listy "jedynki", którego pozycja w tej liście odpowiada wartości zmiennej "x" - indeks miejsc w liście zawsze zaczyna się od zera i ma postać: [0,1,2,3,4,5,6,7,8,9].

Następnie "x" zostaje powiększony o 1, w związku z czym po 10 przebiegach pętli warunek będzie nieaktualny i skrypt przejdzie do wykonywania dalszej części kodu - dla dwójek i trójek. i to wszystko co jedną sekundę, jak ustawiono w llSetTimerEvent. Wbrew pozorom nie będzie to mocno lagować, a na pewno mniej, niż ileśtam skryptów w lampkach ustawionych na listenerach/linkedMessage, w dodatku używających czasem na dodatek osobnych funkcji (llSetColor, llSetAlpha itd.). *ParamsFast pomija też wbudowane domyślnie 0.2-sekundowe opóźnienie funkcji llSetPrimitiveParams / llSetLinkPrimitiveParams, a więc działa szybciej i mniej obciąża region. Ale mało kto o tym wie. :P

Opis funkcji:
http://wiki.secondlife.com/wiki/LlSetLi ... ParamsFast

_________________
Pantera Północy: https://my.secondlife.com/panterapolnocy
Don't walk in front of me - I may not follow. Don't walk behind me - I may not lead. Walk beside me and be my friend.
http://pantera-polnocy.deviantart.com
http://www.firestormviewer.org


Profil E-mail GGOffline

Wyświetl posty z poprzednich:  Sortuj według  

Odpowiedz



Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 3 gości

Panel
Góra
Skocz do:  
cron
SecondLife.pl designed by CvX! Powered by phpBB © phpBB Group - tłumaczenie
SecondLife.pl nie jest oficjalną stroną Second Life. SecondLife.pl is an unofficial Second Life website. SecondLife, SL logo and Second Life related graphics are trademarks of Linden Lab.

Entropia Universe , Planet Calypso