1. Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
    Information ausblenden
  2. Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
    Information ausblenden
  3. Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.
    Information ausblenden

color change in linked prims

Dieses Thema im Forum "Fragen zu Scripting" wurde erstellt von Kottos Sperber, 30. Dezember 2007.

  1. Kottos Sperber

    Kottos Sperber Freund/in des Forums

    Beiträge:
    698
    Zustimmungen:
    7
    Punkte für Erfolge:
    18
    Moin,

    ich habe 3 prims, die gelinkt sind. In einem der 3 ist ein colorchange script.
    Ich moechte, dass auf click 2 der 3 prims die Farbe aendern.
    llSetColor aendert nur die Farbe in dem prim, in dem es laeuft.
    llSetLinkColor aendert die Farbe aller prims.
    Was waere denn ein eleganter Weg, die Farbe in 2 der 3 prims einzustellen?

    kottos

    Code:
                    
    list my_list = [ <1.,1.,1.> ,
                                     <0.5,0.5,.5> ,
                                     <0.0, 0.0, 0.0>, 
                                     <1.0, 0.0, 0.0>,
                                     <0.0, 1.0, 0.0>,
                                     <0.0, 0.0, 1.0>,
                                     <1.0, 1.0, 0.0>,
                                     <0.0, 1.0, 1.0>,
                                     <1.0, 0.0, 1.0>];
                                     
            vector color = <1.0,1.0,0.0>;
            integer face = -1;
            integer num =1;
    default
    {
        state_entry()
        {
        
        }
    
        touch_start(integer number)
        {
            color=llList2Vector(my_list,num);
            llSetLinkColor(-1, color, face);
            num++;
            if (num == 8) num=1;
    
        }
    }
    
     
  2. Michelle Argus

    Michelle Argus Aktiver Nutzer

    Beiträge:
    439
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
  3. Kottos Sperber

    Kottos Sperber Freund/in des Forums

    Beiträge:
    698
    Zustimmungen:
    7
    Punkte für Erfolge:
    18
    Juchhuh, das isses. Recht herzlichen Dank.
    Wie bekomme ich raus, welche Nummer ein prim in einem Link hat (ich habe es durch probieren gefunden, bei 3 prims ist es nicht sonderlich schwer).

    kottos
     
  4. Michelle Argus

    Michelle Argus Aktiver Nutzer

    Beiträge:
    439
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Um die Linknummer herrauszufinden, setzte folgendes Script in den einzelnen Prims:

    Code:
    default
    {
        state_entry()
        {
              llSay(0, (string)llGetLinkNumber());
        }
    }
    
    Übrigens, num startet bei 0 und nicht wie bei dir bei 1 ;) erstetzte also "num = 1" mit "num = 0". Der rest müsste passen...
     
  5. Kottos Sperber

    Kottos Sperber Freund/in des Forums

    Beiträge:
    698
    Zustimmungen:
    7
    Punkte für Erfolge:
    18
    Achja, die C style nummerierung von vektoren. Ist mir noch gar nicht aufgefallen, dass eine Farbe fehlt. Danke.


    kottos
     
  6. SuperMarkus Paine

    SuperMarkus Paine Aktiver Nutzer

    Beiträge:
    193
    Zustimmungen:
    1
    Punkte für Erfolge:
    18
    selbes thema, andere frage:

    ich hab nen 26 prim object. von diesen möchte ich 10 per befehl umfärben können. muss ich jetzt für jedes einzelne prim nen eigenen llSetLinkColor schreiben?
    also z.b.

    llSetLinkColor(4, color, face)
    llSetLinkColor(6, color, face)
    llSetLinkColor(11, color, face)
    llSetLinkColor(23, color, face)
    llSetLinkColor(24, color, face)
    llSetLinkColor(25, color, face)

    oder geht das eleganter? z.b.
    llSetLinkColor((4,6,11,23,24,25), color, face)

    mfg markus
     
  7. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.785
    Zustimmungen:
    1.069
    Punkte für Erfolge:
    123
    Ja geht es und du bist schon aufm richtigen weg.

    Wenn die Linknummern fix sind, leg die Nummern in eine Liste.
    Beim aendern der Farbe frag dann anstelle der nummern die liste ab.

    Ein entsprechendes beispiel findest du hier:
    User:Daemonika Nightfire/Scripts/LinkNumber-List in llSetLinkPrimitiveParamsFast - Second Life Wiki

    Nachtrag:
    Auf dem selben weg kannst sogar bei den entsprechenden prims mehrere spezifische Seiten (face) ansprechen. ;)

    nochn Nachtrag:
    Noch eine Moeglichkeit besteht darin, den Prims namen zu geben und die in einer for schleife den linknummern zuzuordnen, idealerweise vorher im state_entry & changed (CHANGED_LINK) damit die schleife nicht dauernd laggt.
    Auf diese weise ist das Linkset dynamisch und du musst dir nicht die Linknummern raus popeln.

    LG
    Dae
     
  8. SuperMarkus Paine

    SuperMarkus Paine Aktiver Nutzer

    Beiträge:
    193
    Zustimmungen:
    1
    Punkte für Erfolge:
    18
    ich glaub ich mach das mit der liste und pople mir die linknummern raus.
    ich meld mich heute nacht (nach der arbeit) mit nem feedback

    thx Dae
     
  9. Rebekka Revnik

    Rebekka Revnik Superstar

    Beiträge:
    1.081
    Zustimmungen:
    21
    Punkte für Erfolge:
    48
    Hatte vor langer Zeit mal sowas gepostet, aber anscheinend verschwinden hier ältere Beiträge öfter mal. Also mit der Funktion unten kannst alle Pims färben, die im Namen den Text von ID haben, hier als Beispiel color.
    LG Reb
    Code:
    string ID = "color";
    integer FACE = 0;
    
    SetColor(vector v)
    {
        integer x = llGetNumberOfPrims();
        integer i;
        for(i = 1; i <= x; i++)
        {
            if(llSubStringIndex(llGetLinkName(i), ID) != -1) llSetLinkColor(i, v, FACE);
        }
    }
     
  10. Archon Short

    Archon Short Forumsgott/göttin

    Beiträge:
    5.314
    Zustimmungen:
    821
    Punkte für Erfolge:
    124
    Das mit benannten Prims (Objektbeschreibung reicht aus) und der For-Schleife bei changed-Link ist ansich die sicherste Lösung.
    Einfach zu scripten und man muss nicht bei anderen Projekten jedesmal wieder die Linknummern herausfinden.
    ;)
     
  11. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.785
    Zustimmungen:
    1.069
    Punkte für Erfolge:
    123
    huhu,

    hab mir mal nen paar gedanken darum gemacht, wie ich es machen wuerde.
    Dazu habe ich 15 Prims verlinkt und willkuerlich einige mit den Namen PRIM betitelt.

    Nun habe ich folgendes Script (welches auf meinem Beispiel aus der Wiki basiert) nur im Root des Objects.
    Jetzt sollten bem klicken die benannten Prims die farbe wechseln.
    Code:
    [COLOR=DarkOrange]//   ╔════════════════════════════════−−−−−−−−−→
    //   ║ *DS* GetLinkNumbers of LinkNames (linkset) © by Daemonika Nightfire (daemonika.nightfire)
    //   ╚═══════════════════−−−−−−−−−→[/COLOR]
    
    [COLOR=DarkGreen]integer[/COLOR] schalter = [COLOR=Blue]FALSE[/COLOR]; [COLOR=DarkOrange]// status fuer den schalter im touch Event[/COLOR]
    
    [COLOR=DarkGreen]string[/COLOR] LinkName = "[COLOR=DarkGreen]PRIM[/COLOR]"; [COLOR=DarkOrange]// festgelegter name fuer die gewuenschten Prims[/COLOR]
    [COLOR=DarkGreen]list[/COLOR] LinkNumber = []; [COLOR=DarkOrange]// leere Liste[/COLOR]
    
    GetNumber() [COLOR=DarkOrange]// funktion aus mehreren Events abrufbar[/COLOR]
    {
        [COLOR=DarkGreen]integer[/COLOR] i;
        [COLOR=Blue]for[/COLOR](i = 0; i <= [COLOR=Red]llGetNumberOfPrims[/COLOR](); i++) [COLOR=DarkOrange]// zaehlt die Prims durch[/COLOR]
        {
            [COLOR=Blue]if[/COLOR]([COLOR=Red]llGetLinkName[/COLOR](i) == LinkName) [COLOR=DarkOrange]// ueberprueft die Namen[/COLOR]
            {
                LinkNumber += i; [COLOR=DarkOrange]// fuegt die Linknummer des prims mit richtigen Namen der Liste hinzu[/COLOR]
            }
        }
    }
    
    [COLOR=Indigo]default[/COLOR]
    {
        [COLOR=RoyalBlue]state_entry[/COLOR]()
        {
            GetNumber(); [COLOR=DarkOrange]// ruft die Funktion auf[/COLOR]
        }
        
        [COLOR=RoyalBlue]touch_start[/COLOR]([COLOR=DarkGreen]integer[/COLOR] total_number)
        {
            [COLOR=DarkGreen]integer[/COLOR] i = ~[COLOR=Red]llGetListLength[/COLOR](LinkNumber); [COLOR=DarkOrange]// ruft die Liste mit den LinkNummern auf[/COLOR]
            [COLOR=Blue]if[/COLOR](schalter == [COLOR=Blue]FALSE[/COLOR])
            {
                [COLOR=Blue]while[/COLOR] (++i) [COLOR=DarkOrange]// geht jede linknummer einzeln durch[/COLOR]
                {
                    [COLOR=Red]llSetLinkPrimitiveParamsFast[/COLOR]([COLOR=Red]llList2Integer[/COLOR](LinkNumber,i),[[COLOR=Blue]PRIM_COLOR[/COLOR],[COLOR=Blue]ALL_SIDES[/COLOR],<0,1,0>,1.0]); [COLOR=DarkOrange]// setzt die gewuenschten Parameter[/COLOR]
                }
                schalter = [COLOR=Blue]TRUE[/COLOR];
            }
            [COLOR=Blue]else if[/COLOR](schalter == [COLOR=Blue]TRUE[/COLOR])
            {
                [COLOR=Blue]while[/COLOR] (++i) [COLOR=DarkOrange]// geht jede linknummer einzeln durch[/COLOR]
                {
                    [COLOR=Red]llSetLinkPrimitiveParamsFast[/COLOR]([COLOR=Red]llList2Integer[/COLOR](LinkNumber,i),[[COLOR=Blue]PRIM_COLOR[/COLOR],[COLOR=Blue]ALL_SIDES[/COLOR],<1,0,0>,1.0]); [COLOR=DarkOrange]// setzt die gewuenschten Parameter[/COLOR]
                }
                schalter = [COLOR=Blue]FALSE[/COLOR];
            }
        }
        
        [COLOR=RoyalBlue]changed[/COLOR]([COLOR=DarkGreen]integer[/COLOR] change)
        {
            [COLOR=Blue]if[/COLOR](change & [COLOR=Blue]CHANGED_LINK[/COLOR]) [COLOR=DarkOrange]// ueberprueft ob sich das linkset aendert und sich dadurch die Linknummern verschieben[/COLOR]
            {
                LinkNumber = []; [COLOR=DarkOrange]// loescht die liste, um mit einer leeren erneut zu beginnen[/COLOR]
                GetNumber(); [COLOR=DarkOrange]// ruft die Funktion auf[/COLOR]
            }
        }
    
        [COLOR=RoyalBlue]on_rez[/COLOR]([COLOR=DarkGreen]integer[/COLOR] start)
        {
            [COLOR=Red]llResetScript[/COLOR]();
        }
    }
    Werds noch testen, wenns fehlerfrei ist fuege ich es den anderen Beispielen in der Wiki hinzu.

    Nachtrag:
    Link zur optimierten Version:
    User:Daemonika Nightfire/Scripts/LinkNumber-List in llSetLinkPrimitiveParamsFast - Second Life Wiki

    LG
    Dae
     
  12. SuperMarkus Paine

    SuperMarkus Paine Aktiver Nutzer

    Beiträge:
    193
    Zustimmungen:
    1
    Punkte für Erfolge:
    18
    huhu Dae

    das funzt ganz supi :) schön das du dir für mich nen kopf gemacht hast. heute abend (morgen) wär bei mir auch nichts mehr rausgekommen :)

    thx
    Markus
     
  13. Herm Piek

    Herm Piek Gesperrt

    Beiträge:
    133
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Mir gefällt ein Mix aus beiden Vorschlägen noch besser. Rebekka hat den schlichteren Code, weil es ohne die Listen, die Dae zur Hilfe nimmt, auskommt. Ansonsten habe ich Dae's Vorschlag aufgenommen, weil es zeigt, dass man einfach in einer Routine mehrere Prims mit unterschiedlichen Farben(oder Texturen usw.) belegen kann.
    ich habe einen Primturm gebaut, wo einige wenige Prims "eins" heissen, und andere wenige heissen "zwei", dazwischen sind noch Prms mit anderen Namen (Object), die also nicht angesteuert werden:

    Code:
    string ID1 = "eins";
    string ID2 = "zwei";
    integer FACE = 0;
    integer schalter;
    
    SetColor(vector v, string ID) {
        integer x = llGetNumberOfPrims();
        integer i;
        for(i = 1; i <= x; i++) {
            if(llSubStringIndex(llGetLinkName(i), ID) != -1) llSetLinkPrimitiveParamsFast(i, [PRIM_COLOR, FACE, v, 1.0]);
        }
    }
    
    default {
        state_entry() {
            schalter = FALSE;
        }
        touch_start(integer total_number) {
            if(schalter) {
                SetColor( <1,0,0>, "eins");
                SetColor( <0,1,0>, "zwei");
            } else {
                SetColor( <0,1,0>, "eins");
                SetColor( <1,0,0>, "zwei");
            }
            schalter = !schalter;
        }
    }
     
  14. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.785
    Zustimmungen:
    1.069
    Punkte für Erfolge:
    123
    duu?

    genau das wollte ich mit den Listen vermeiden, das bei jedem triggern die funktion und die for-schleife jedesmal ausgefuehrt wird.
    Deshalb auch nur im state entry und um change, damit der touch nur noch die bekannten Prims ansteuert und nicht mehr alle abfragt, den bei 256 Prims koennte es evtl. ein wenig dauern bis der fertig ist.

    LG
    Dae
     
  15. Herm Piek

    Herm Piek Gesperrt

    Beiträge:
    133
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Okay, bei sehr vielen Prims hat das Sinn. Hab ich nicht bedacht. Ich würde es dem Einzelfall entsprechend wählen.

    LG,
    Herm
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden