• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • 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.
  • 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.

color change in linked prims

Kottos Sperber

Freund/in des Forums
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;

    }
}
 
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
 
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...
 
Michelle Argus schrieb:
Übrigens, num startet bei 0 und nicht wie bei dir bei 1 ;) erstetzte also "num = 1" mit "num = 0". Der rest müsste passen...

Achja, die C style nummerierung von vektoren. Ist mir noch gar nicht aufgefallen, dass eine Farbe fehlt. Danke.


kottos
 
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
 
oder geht das eleganter? z.b.
llSetLinkColor((4,6,11,23,24,25), color, face)
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
 
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
 
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);
    }
}
 
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.
;)
 
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
 
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
 
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;
    }
}
 
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
 
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

Okay, bei sehr vielen Prims hat das Sinn. Hab ich nicht bedacht. Ich würde es dem Einzelfall entsprechend wählen.

LG,
Herm
 

Users who are viewing this thread

Zurück
Oben Unten