(09.11.2010, 20:50)Leonardo Buechi link schrieb: Hallo zusammen, hätte da wieder mal ne Frage ...
wie baut man zwei Knöpfe für einen Texturswitcher vor & zurück.
Das script für den switcher ist Textbasierend, möchte aber zusätzlich manuell vor und zurück switchen
Code:integer channel=0;
integer listen_handle;
string texture;
default
{
state_entry()
{
llWhisper(0,\"Touch me to begin\");
}
listen( integer channel, string name, key id, string message)
{
listen_handle = llListen (channel, \"\", NULL_KEY , \"\");
if (llGetInventoryType(message) == INVENTORY_TEXTURE)
{
llWhisper(0,\"Changing texture\");
llSetLinkPrimitiveParamsFast(LINK_SET,[PRIM_TEXTURE,ALL_SIDES,message,<1,1,1>,<0,0,0>,0]);
}
else
{
llWhisper(0,message+\" not found in inventory\");
}
}
touch_start(integer total_number)
{
list result = [];
integer n = llGetInventoryNumber(INVENTORY_TEXTURE);
string temp;
llWhisper(0,\"Say the name of the texture you want\");
while(n)
{
temp = llGetInventoryName(INVENTORY_TEXTURE, --n);
llWhisper(0,temp);
result = temp + result;
}
listen_handle = llListen (channel, \"\", NULL_KEY , \"\");
llSetTimerEvent(30);
}
timer()
{
llWhisper(0,\"No longer listening, touch to change texture\");
llListenRemove(listen_handle);
llSetTimerEvent(0);
}
}
Wie meinen "Textbasierend" ??? Also ich finde das ein ganz schreckliches Script verzeihe ...
Es giebt mehre Möglichkeiten ein "Button" in einem Automaten zu etablieren, oder mehre.
Erste währe via einem Listen wie Du da im Script hast und im Button ein Script was das auslösen bewierkt beim weiter Switchen...
Listen Event im Haupt-Script :
Code:
integer lampen_kanal=88;
default
{
state_entry(){
llListen(lampen_kanal,"",NULL_KEY,"");
}
listen( integer channel, string name, key id, string message ){
if (message == "kill"){
llDie();
}
}
Say touch funktion im Script für den Button:
Code:
touch_start(integer irgendwas){
llWhisper(lampen_kanal,"kill");
}
ABER SO WAS NIMMT MAN NIEMALS FÃR EINEN AUTOMATEN !!! Sprich ein Automat ist für mich ein Object mit mehren Prims die verlinkt sind und 1 oder mehre Buttons, wie Funktionen in form von Scripts beinhaltet. Es giebt wenig fälle wo man auf diese "Komunikation" greiffen MUSS. Nämlich wen z.B. 2 Automaten die nicht verlinkt sind daten austauschen müssen. Dies funktioniert Region weit (also Sim weit).
Eine weitere Anwendung kann bei einem Reezer Vendor sein, den auch da sind die Automaten nicht verlinkt.
2te Möglichkeit ist via einem linkedMessage Event und in den Buttons ein script was eben dem Haupt Script eine weiter switschen mitteilt.
Im Haupt Script der Event :
Code:
link_message(integer sender_num, integer num, string str, key id){
if(str=="forward"){++invLoopCount;++count_real;
if (count_real > invCount){invLoopCount = 0;count_real = 1;}
tex_name=llGetInventoryName(INVENTORY_TEXTURE, invLoopCount);
llSetPrimitiveParam([PRIM_TEXTURE,2,tex_name,<1,1,0>,<0,0,0>,0,PRIM_TEXTURE,4,tex_name,<1,1,0>,<0,0,0>, 0]);
llSetText("Free Stein Textures \n Textur-Name :"+ (string) tex_name + "\n Textur-Nummer :"+ (string) count_real +" of "+ (string) invCount,<1.0,1.0,1.0>, 1);}
}
Im Button das Script :
Code:
default
{
touch_start(integer total_number)
{
llMessageLinked (LINK_ROOT, 0, "forward", NULL_KEY);
}
}
So was kann man schon eher benutzen als Buttons bei einem Automaten. Mache ich aber eher nicht, sehr gut ist dieser Event übrigens um etwas zu "buffern" da dieser Event ein Speicher Volumen bis zu 64 hat. Als beispiel ich habe sehr genau Zeit Messungen die sehr schnell ein Auswertungs Script erreichen sollten und vor allem abgearbeitet werden müssen (beispiel eine High Score Zeit Messung) kann man über diesen Event eben solche eingänge, zum beispiel bei Lags, buffern. Oder wen ein Button seinen over Text z.B. ändern können muss, nutze ich diese Tech eben so.
(anderes beispiel, Sensor hat eine grösse von 16... bzw Listen)
3te und beste Möglichkeit aus meiner sicht ist das ganze in einem einzigem Haupt-Script zu integrieren in dem man analysiert Welcher Button am Automaten gedrückt wurde. Im Fach Chargon sagt man es wird analysiert welches Prim im LinkSet angeklickt wurde.
Ein Einziges Script für Automaten Button Steuerung :
Code:
integer button;
default{
touch_start(integer irgendwas){
button = llDetectedLinkNumber(0);
if(button==1){
llSay(0,"Root-Prim wurde angeklickt");
}else if(button==2){
llSay(0,"Prim 2 wurde angeklickt");
}else{
}
}
}
Kein extra Script für den Button sauber klein und schnell. Wen man nun nicht direkt bewust verlinkt hatte kann man einfach ermitteln welches Prim im Linkset welche nummer hat, in dem man eine weitere llSay(0,(string) button); nach dem button = llDetectedLinkNumber(0); integriert.
Meine stärke ist nicht das Wissen, aber dass lernen. :)