Odpowiedz
Autor Wiadomość
Nie podano
PostWysłany: 22 Paź 2011, 09:10 
Dołączenie:
Październik 2011
Posty: 2
Nie jestem zbytnio doświadczony w SL, więc przejdę od razu do rzeczy.
Byłem sobie kiedyś w sandboxie, i nawiedziła mnie wizja - zrobię lampkę, taką że KLIK - świeci się, drugi KLIK - gaśnie.
Zaplanowałem, że świecić się będzie kula, która stoi na "stojaczku" (walcu). Jak zrobić skrypt na światło przy klikaniu? Mam podstawę:
Cytuj:
default
{
touch_start(integer total_number)
{
ŚWIATŁO;
state_swiatlo();
}
}
state_swiatlo()
{
touch_start(integer total_number)
{
NO-ŚWIATŁO;
state_default;
}
}

Co zamieścić zamiast NO-ŚWIATŁO i ŚWIATŁO?


Profil E-mail Offline
Mężczyzna
PostWysłany: 22 Paź 2011, 11:14 
Dołączenie:
Listopad 2010
Posty: 78
nick w SL: Kazuhiro Swords
http://wiki.secondlife.com/wiki/PRIM_POINT_LIGHT - Prim swieci, jakby emituje fotony na inne przedmioty.

Przyklad: llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE,<0.0,1.0,0.0>,1.0, 10.0, 0.5]);

TRUE - funkcja light jest wlaczona, mozna zamienic na FALSE, wtedy analogicznie wylaczona
Nastepny parametr odpowiada za kolor w formacie RGB, aby swiecilo na bialo wprowadz <1,1,1>
Kolejna wartosc oznacza "intensity" co oznacza jakby natezenie.
Kolejna wartosc to radius czyli zasieg, maxymalne do 20m.
Ostatnie to falloff. Im mniejsze tym lepiej swieci, dokladnie tego wytlumaczyc nie umiem :P

http://wiki.secondlife.com/wiki/LlSetPr ... FULLBRIGHT - Prim staje sie "full bright" czyli sam jest oswietlony.

Przyklad: llSetPrimitiveParams([PRIM_FULLBRIGHT,ALL_SIDES]);

Parametr ALL_SIDES odpowiada za sciany obiektu, w tym przypadku wszystkie sciany prima beda rozswietlone, mozna to zamienic na wartosci od 0 dla 5 dla boxa bez zadnych udziwnien.

http://wiki.secondlife.com/wiki/PRIM_GLOW - prim otrzymuje jakby aure swiatla.

Przyklad: llSetPrimitiveParams( [ PRIM_GLOW, ALL_SIDES, .3 ] ) ;

ALL_SIDES - wybor scian jak w funkcji powyzej
0.3 - oznacza natezenie tej aury, od 0.0 do 1.0

Mam nadzieje, ze pomoglem.

_________________
https://marketplace.secondlife.com/stores/48539/
https://marketplace.secondlife.com/stores/48539


Profil E-mail Offline
Mężczyzna
PostWysłany: 22 Paź 2011, 13:00 
Dołączenie:
Lipiec 2008
Posty: 3306
Skąd: Konin
nick w SL: MaxJames Chemistry
Ja się jedynie odniosę do zmieniania stanu. Robi isę to np. state default, a nie state_default. Nowy stan jest poprzedzony słowem state (nie dotyczy default)


Profil E-mail Offline
PostPost został usunięty przez Madelaine 22 Paź 2011, 22:34.
Powód: post nie wnoszący niczego do tematu
Nie podano
PostWysłany: 28 Paź 2011, 14:37 
Awatar użytkownika
Dołączenie:
Kwiecień 2011
Posty: 95
Szablon kodu można napisać prościej i bez bugów na przykład tak:

Kod:
//stan domyślny to lampa zgaszona
default
{
   touch_end()
   {
      //Wprowadź kod lampy świecącej
      state open;
   }
}
state open;
{
   touch_end()
   {
      //Wprowadź kod lampy zgaszonej
      state default;
   }   
}

_________________
cyfrowyswiat


Profil E-mail Offline
Kobieta
PostWysłany: 02 Lis 2011, 14:31 
Awatar użytkownika
Dołączenie:
Wrzesień 2007
Posty: 497
Skąd: Warszawa
nick w SL: Ayumi Cassini
Tak naprawdę w skrypcie lampki w ogóle nie potrzeba zmieniać stanu - wystarczy zmienna w której będziesz zapisywać, czy światło jest aktualnie włączone.

Musisz uwzględnić trzy parametry, aby Twoje światełko wyglądało w miarę naturalnie:
:: emisja światła - czyli podstawowa funkcja lampki
:: full bright - czyli "jasność" prima (samo ustawienie emisji światła nie spowoduje, że prim rozświetli się jak żarówka)
:: glow - pozwoli na lekką poświatę wokół żarówki

Najprostszy skrypt będzie wyglądał tak:

Kod:
integer LIGHT;

default
{
    state_entry()
    {
        LIGHT = FALSE;
        llSetPrimitiveParams ([     PRIM_POINT_LIGHT, FALSE, <0.9, 0.8, 0.6>, 5.0, 3.0, 0.75,
                                    PRIM_FULLBRIGHT, ALL_SIDES, FALSE,
                                    PRIM_GLOW, ALL_SIDES, 0.0   ]);
    }

    touch_start(integer total_number) // po kliknięciu
    {
        if(LIGHT) // jeśli światło się świeci;
        // powyższą linijkę można również zapisać w ten sposób: if(LIGHT == TRUE)
        {
            LIGHT = FALSE; // ustaw w zmiennej, że światło jest wyłączone
            // wyłącz światło:
            llSetPrimitiveParams ([     PRIM_POINT_LIGHT, FALSE, <0.9, 0.8, 0.6>, 5.0, 3.0, 0.75,
                                        PRIM_FULLBRIGHT, ALL_SIDES, FALSE,
                                        PRIM_GLOW, ALL_SIDES, 0.0   ]);
           
        }
        else // w przeciwnym wypadku, czyli jeśli światło jest wyłączone
        {
            LIGHT = TRUE; // ustaw w zmiennej, że światło jest włączone
            // włącz światło:
            llSetPrimitiveParams ([     PRIM_POINT_LIGHT, TRUE, <0.9, 0.8, 0.6>, 5.0, 3.0, 0.75,
                                        PRIM_FULLBRIGHT, ALL_SIDES, TRUE,
                                        PRIM_GLOW, ALL_SIDES, 0.03   ]);
        }
    }
}


To jest skrypt, który można włożyć bezpośrednio do prima imitującego żarówkę. Kliknięcie w żarówkę spowoduje zapalenie światła, a ponowne kliknięcie zgasi światło. Możesz ustawić żarówkę jako root prim, wtedy kliknięcie gdziekolwiek w lampkę spowoduje zapalenie się żarówki, a można też napisać osobny skrypt do lampki, osobny do żarówki. Oczywiście skrypt można by rozwinąć - np. ustawić, aby żarówkę mógł zapalać jedynie właściciel, dodać menu z różnymi kolorami/intensywnościami światła, dodać możliwość automatycznego włączania i wyłączania lampki, kiedy w SL robi się noc/dzień itd., ale do celów naukowych powyższy prosty skrypt powinien Ci wystarczyć :)

_________________
Zapraszam do mojego sklepu: Magic Nook
SL Marketplace: https://marketplace.secondlife.com/stores/7318
Blog: http://ayumicassini.blogspot.com


Ostatnio edytowany przez Ayumi Cassini, 05 Lis 2011, 22:50, edytowano w sumie 1 raz

Profil E-mail Offline
Nie podano
PostWysłany: 05 Lis 2011, 15:21 
Awatar użytkownika
Dołączenie:
Kwiecień 2011
Posty: 95
Moim zdanie w programowaniu dla SL właśnie powinno się używać jeżeli jest to tylko możliwe stanów zamiast zmiennych globalnych i instrukcji warunkowych if else. Przy tak prostym kodzie lampki nie ma to znaczenia z którego rozwiązania skorzystamy. Przy większych projektach rozwiązanie pierwsze pozwala uzyskać lepszą wydajność w SL. Każda użyta w kodzie zmienna oraz każda zwrotnica if else o wiele bardziej obciąża serwery LL niż przejścia między stanami.
Kod:
default
{
    touch_end (integer total_number)
    {
        llSetPrimitiveParams ([ PRIM_POINT_LIGHT, TRUE, <0.9, 0.8, 0.6>, 5.0, 3.0, 0.75,
                                          PRIM_FULLBRIGHT, ALL_SIDES, TRUE,
                                          PRIM_GLOW, ALL_SIDES, 0.03   ]);

        state open;
    }
}
   
state open
{
    touch_end (integer total_number)
    {
        llSetPrimitiveParams ([  PRIM_POINT_LIGHT, FALSE, <0.9, 0.8, 0.6>, 5.0, 3.0, 0.75,
                                           PRIM_FULLBRIGHT, ALL_SIDES, FALSE,
                                           PRIM_GLOW, ALL_SIDES, 0.0   ]);

        state default;
    }
}

_________________
cyfrowyswiat


Profil E-mail Offline
Kobieta
PostWysłany: 05 Lis 2011, 22:52 
Awatar użytkownika
Dołączenie:
Wrzesień 2007
Posty: 497
Skąd: Warszawa
nick w SL: Ayumi Cassini
Myślę, że się mylisz :) Używanie stanów w każdej możliwej sytuacji jest błędnym podejściem, bo w wielu przypadkach jest taka możliwość, ale nie ma to sensu. Zarówno zmienne, jak i stany, mają swoje zastosowanie w odpowiednich sytuacjach. Zauważ chociażby fakt, że w LSL nie ma możliwości innej komunikacji między stanami, jak poprzez użycie zmiennej globalnej - więc masz zmianę stanu plus zmienną. Ponadto, zmieniając stan tracisz między innymi nasłuchy i zakolejkowane eventy. W rozwiązaniach opierających się na zmianach stanów trzeba też często powielać pewne procedury, tak, żeby działały one w każdym ze stanów. Dlatego uważam, że ważny jest raczej układ logiczny skryptu - prosty i klarowny obciąży mniej zasobów sima i mniej będzie lagował, niż skrypt w którym na upartego stosuje się zmiany stanów. Po prostu nie każdy skrypt da się usprawnić w ten sposób, a w niektórych przypadkach wręcz warto jest zastosować zmienne.

_________________
Zapraszam do mojego sklepu: Magic Nook
SL Marketplace: https://marketplace.secondlife.com/stores/7318
Blog: http://ayumicassini.blogspot.com


Profil E-mail Offline
Kobieta
PostWysłany: 02 Mar 2012, 12:15 
Moderator
Awatar użytkownika
Dołączenie:
Luty 2012
Posty: 530
Skąd: Tychy
nick w SL: PanteraPolnocy
*odgrzewa kotleta*

A ja tylko od siebie dodam, że warto sobie wyrobić nawyk stosowania llSetPrimitiveParamsFast / LlSetLinkPrimitiveParamsFast zamiast llSetPrimitiveParams / LlSetLinkPrimitiveParams, bo wtedy skrypt nie pauzuje na 0.2 sekundy. Czasem bywa to potrzebne, pewnie, ale w wypadku powyższej lampki skrypt niepotrzebnie czeka. W pętlach while/for użytych z głową gołym okiem widać efekty tego "Fast". ;)

np. 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 4 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