FORUM PTT -

POMOC inne - Podświetlanie przyrządów wywoływane skryptem.

MartinST43 - 21-11-2009, 10:54
: Temat postu: Podświetlanie przyrządów wywoływane skryptem.
Dobry

Tak sobie zacząłem kombinować ze skryptami w kabinie i wykombinowałem już co nieco, ale mój problem w tym temacie tyczy się "świecenia się" siatki podświetlania.
Poskładałem sobie różne skrypty i przystosowałem je dla własnych potrzeb w wyniku czego zrobiłem chyba prosty skrypt na wywoływanie siatki przełącznikiem. Wszystko działa tzn. przełączam przełącznik i pojawia się siatka, przełączam drugi raz - siatka znika.
Wszystko byłoby ok, gdyby nie to, że mam też zamontowany skrypt na przyciemnianie światła w kabinie wraz z czasem. Niestety przyciemnia się też siatka podświetlania - czy jest jakiś (musi być) sposób na "świecenie się" siatki podświetlania pomimo tego przyciemnia. Sama siatka ma w configu wpis "kind "light"", ale to nic nie daje.



Marcin
erniesouchak - 21-11-2009, 15:53
:
Sprobuj zmienic nazewnictwo siatek w configu i skrypcie tak by nie pokrywaly sie ze soba - to jest pierwsze co mi sie rzuca w oczy. Ogolnie jesli chcesz to moge Ci polecic bardzo prosty tutorial odnosnie skryptow kabin (po angielsku co prawda) - bo tak naprawde skryptowanie kabiny odnosi sie do korzystania z czterech funkcji (ktore sie rozwija w zaleznosci od potrzeb - i tu jest glowny problem skryptowania bo trzeba zarowno znac dzialanie tych potrzeb jak i ich przeniesienie na jezyk programowania, a co gorsza trzeba to jeszcze odniesc na srodowisko gry - przyklad z drzwiami w ezt: chcemy miec mozliwosc przelaczania zeby sie otworzyly drzwi - trzeba i nadac zmienne, zeby dane zostaly zapisane do pamieci, trzeba odpowiednio nazwac siatki czy wykorzystac funkcje ze srodowiska gry - stad tak niby prozaiczna pierdola wywoluje u mnie niezmiennie wstret do skryptowania kabin - nie czuje do tego blues'a po prostu).
MartinST43 - 21-11-2009, 18:46
:
Dobry

Właśnie po Twoim poście przypadkowo szukając objaśnienia do któregoś z wpisów w skryptcie w google trafiłem na ten poradnik - przyda się.

Wracając do podświetlania: pozmieniałem nazwy siatek, aby się nie gryzły - nic to nie dało.
Spróbowałem więc dodać jakiś wpis w skrypcie pojawiania się siatki podświetlania: zasugerowałem się skryptem na przyciemnianie i wpisem:
Kod:
SetCabLightIntensity (1)

Skopiowałem go i przerobiłem na:

Kod:
SetMeshLightIntensity ("noc_light", true, 1);


Dodałem ten wpis do listy zdarzeń wynikających z przełączenia przełącznika od włączania oświetlenia:

Kod:
    } else if (control == noc_switch_1) {
            if (value > 0.9 and !light) {
                light = true;
        SetMeshVisible("noc_light", true, 0.1f);
        SetMeshLightIntensity ("noc_light", true, 1);
            } else if (light) {
                light = false;
        SetMeshVisible("noc_light", false, 0.1f);
            }


Ale skończyło się to:



Męczę się z tym już dziewiąta godzinę chyba i już właściwie skończyły mi się wszystkie pomysły.
Najfajniejsze jest to, że w kabinie BR118 gdzie jest też przyciemnianie się światła w kabinie wraz z czasem siatka amperomierzy nie przyciemnia się w ogóle a jej wpis tak wygląda w configu:

Kod:
    anzeigen {
        mesh                    "Anzeigen.im"
        auto-create                1
        att                    "a.anzeigen"
    }


Element "anzeigen" nie jest w ogóle też przypisany w skrypcie kabiny...

A tak wyglądają wpisy w moim configu:

Kod:
    noc_light {
        mesh                    "noc.im"
        auto-create                0
        att                    "a.noc"
    }
    noc_light1 {
        mesh                    "noc1.im"
        auto-create                0
        att                    "a.noc1"
    }


Marcin
erniesouchak - 21-11-2009, 18:54
:
Wywala Ci blad bo funkcja CabLightIntenisty jest funkcja natywna w srodowisku (czyli dostepna od razu z marszu i jest funkcja wewnetrzna), a zmiana jej nazwy przez Ciebie stworzylo odwolanie do nieistniejacej funkcji - warto sie zapoznac z API (jak znajde link to podam) lub jesli chcesz od razu to wlaz do katalogu scripts i szukaj tam defaultlocomotivecabin.gs i cabin.gs - mozesz je przejrzec i tam sa wlasnie wszystkie funkcje natywne zdeklarowane (oczywiscie modyfikowania tych plikow nie polecam bo sie skonczy zle) i w wiekszosci opisane do czego sluza. Ostatecznie wklej tu skrypt jaki masz i wtedy sprobuje pomoc.
erniesouchak - 21-11-2009, 19:13
:
http://www.erniesouchak.c...ukcje/index.chm link do API (walic Auran ze nie ma tego nigdzie na wierzchu).
MartinST43 - 21-11-2009, 20:50
:
Okey - dzięki za to.

Na dziś wymiękłem. Tak zacząłem przeglądać i kombinować, że w końcu lista błędów zrobiła się ciut za duża : D Próbowałem podczepić części skryptu z kabiny lokomotywy DD40 - nie wyszło.

Mój skrypt wygląda w wersji działającej (wycieraczki, wskazówka pozycji i pojawianie się siatek podświetlania) tak:

Kod:
include "defaultlocomotivecabin.gs"

class st43 isclass DefaultLocomotiveCabin {

    float gametime = 0;
    float normalizedgametime;
    float cablight = 1;
    CabinControl throttle_l;
    CabinControl throttle_r;
    CabinControl wiper_switch;
    CabinControl wiper_switch_1;
    CabinControl noc_switch_1;
    CabinControl noc_switch_2;

    public bool wiping = false;
    public bool light = false;

    public void Init(void) {
        inherited();

        throttle_l = GetNamedControl("throttle_lever");
        throttle_r = GetNamedControl("throttle_lever-r");
        wiper_switch = GetNamedControl("wiper_switch");
    wiper_switch_1 = GetNamedControl("wiper_switch_1");
    noc_switch_1 = GetNamedControl("noc_switch_1");
    noc_switch_2 = GetNamedControl("noc_switch_2");
    AddHandler(me, "Cablight", null, "Cablight");
    PostMessage(me, "Cablight", "", 0.1f);

    }

    public void Update(void) {
        inherited();

        float value;

        // Wskazowka
        //
        value = loco.GetEngineSetting("throttle");
        throttle_l.SetValue(value);
        throttle_r.SetValue(value);
    }

    void UserSetControl(CabinControl control, float value) {

        if (control == throttle_l or control == throttle_r) {
            loco.SetEngineSetting("throttle", value);

        } else if (control == wiper_switch) {
            if (value > 0.9 and !wiping) {
                wiping = true;
                StartMeshAnimationLoop("wipers");
                SetMeshAnimationSpeed("wipers", 1.0);
            } else if (wiping) {
                wiping = false;
                StopMeshAnimation("wipers");
            }
         
    } else if (control == wiper_switch_1) {
            if (value > 0.9 and !wiping) {
                wiping = true;
                StartMeshAnimationLoop("wipers_1");
                SetMeshAnimationSpeed("wipers_1", 1.0);
            } else if (wiping) {
                wiping = false;
                StopMeshAnimation("wipers_1");
            }

    } else if (control == noc_switch_1) {
            if (value > 0.9 and !light) {
                light = true;
        SetMeshVisible("noc_light", true, 0.1f);
            } else if (light) {
                light = false;
        SetMeshVisible("noc_light", false, 0.1f);
            }
       
    } else if (control == noc_switch_2) {
            if (value > 0.9 and !light) {
                light = true;
        SetMeshVisible("noc_light1", true, 0.1f);
            } else if (light) {
                light = false;
        SetMeshVisible("noc_light1", false, 0.1f);
            }
       
    } else {
            inherited(control, value);
        }
    }

    void Cablight(Message msg)
    {
    gametime = World.GetGameTime();
    if (gametime < 0.5)
        {
        normalizedgametime = (1 - gametime - 0.5) * 2;
        }
    else
        {
        normalizedgametime = (gametime - 0.5) *2;
        }

    if (normalizedgametime < 0.4)
        SetCabLightIntensity (0.2);

    if (normalizedgametime > 0.55)
        SetCabLightIntensity (1);

    if (normalizedgametime > 0.4 and normalizedgametime < 0.55)
        SetCabLightIntensity (0.2 + ( normalizedgametime - 0.4 ) * ( normalizedgametime / 0.103125 ) );

    PostMessage(me, "Cablight", "", 5.0f);
    }
};


Mam jeszcze dosyć niezrozumiały przeze mnie problem: przy pierwszym przełączeniu przełącznika od wycieraczki animacja odtwarza się tylko raz - trzeba jeszcze raz zrobić tę samą czynność, żeby animacja po włączeniu powtarzała się. Podobnie (ale tu nie ma animacji) jest z podświetlaniem - trzeba dwa razy przełączać przełącznik za pierwszym użyciem, aby zadziałało wszystko dobrze.

Marcin
erniesouchak - 21-11-2009, 21:12
:
Zasiegnalem do zrodla (API) - funkcja SetCabLightIntensity wplywa na oswietlenie kabiny i zachowuje sie jako typowe swiatlo silnika gry, a nie bazuje na rzeczywistej fizyce, wiec po prostu przygasa wszystko w kabinie. Ewentualnie siatka amperomierza w BR118 jest wyeksportowana z gmaxa z zastosowaniem selfillumination, wiec to nie musi byc sterowalne w zaden sposob, po prostu sie caly czas swieci jak psu jaja.
MartinST43 - 24-11-2009, 16:11
:
Bry

http://www.youtube.com/watch?v=b5NyRP65hjE

Na filmiku widać co działa, ale też widać problem, z którym się borykam (widać to np. przy pierwszym włączaniu wycieraczek): przełączniki wykonują swoje zadanie wywoływania tego, co mają podane w skypcie dopiero za drugim przełączeniem (potem jest już wszystko ok, czasem za pierwszym razem załapie). Tak samo z animacja wycieraczek: za pierwszym razem odtwarza się pojedyncza animacja, a dopiero za drugim animacja się zapętla (w skrypcie ma wyraźnie podane, że ma się zapętlać od początku [chyba ; )]).
Za bardzo nie wiem co może być tego przyczyną.
Inne skrypty mają jakieś wpisy dotyczące danych kabiny (tak to rozumiem), ale za choinkę nie jestem w stanie tego zrozumieć.

Kod:
      // reset the controls from saved values
      DD40CabinData ddcd = cast<DD40CabinData>cd;
      float value = 0.0;


I jeszcze jedno pytanie: do czego służy wpis "x.yf"? Przykład (tu: 0.1f):

Kod:
    } else if (control == noc_switch_1) {
            if (value > 0.9 and !light) {
                light = true;
        SetMeshVisible("noc_light", true, 0.1f);
            } else if (light) {
                light = false;
        SetMeshVisible("noc_light", false, 0.1f);
            }


Marcin
erniesouchak - 24-11-2009, 16:39
:
Marcin, ten pierwszy cytat dotyczy odwolania do CabinControl (statyczna czesc skryptu dotyczaca przechowywania wartosci przelacznikow itp. w pamieci), pobierz sobie ED72 i tam w kabinie winien byc moj skrypt odnosnie sterowania drzwiami z wykorzystaniem wlasnie tego, popatrz jak to wyglada - akurat na drzwiach to idzie latwo zrozumiec. Natomiast ten zapis 0.1f rownie dobrze moze byc zapisany jako 0.1 (dotyczy to zmiennej typu float - stad f na koncu, nawyk autora z ktoregos z jezykow), a w tej funkcji podajesz ta wartoscia czas znikania/pokazywania siatki (true - pokaz false - ukryj) wartosc 0.0 powoduje natychmiastowe znikniecie, swego czasu wartosci inne niz 0.0 powodowaly wylot TRS2004 do pulpitu, od 2006 to przeszlo, ogolnie efekt jest niezly (podobny zrobilem w testach JDS-ow ostatnio na swiatlach bialych siatka).
MartinST43 - 24-11-2009, 16:56
:
Okey.

Co do skryptu w kabinie ED72 - jeśli dobrze widzę, to jest "zamknięty", jak skrypty taboru HDM : )

Marcin
erniesouchak - 24-11-2009, 17:04
:
Ech bezmusk ze mnie byl z tym zamykaniem, teraz by sie przydalo.