|
Finalement j'ai voulu tester un peu le fondu enchaîné et je suis arrivé à un truc sympa. Pour commencer créez deux boîtes de base et liez les. Ensuite glissez ce script dedans pour construire le panneau (composé de deux prims évidemment ) :
default { state_entry() { llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <.4,.4,.4>, 1.0, PRIM_COLOR, 0, <1.0,1.0,1.0>, 1.0, PRIM_TEXTURE, ALL_SIDES, "819d87ad-913d-37a7-1edf-d269f3bbb624", <8.9,.8,0.0>, <0.0,0.0,0.0>,0.0, PRIM_TEXTURE, 0, "819d87ad-913d-37a7-1edf-d269f3bbb624", <1.0,1.0,.0>, <0.0,0.0,0.0>,0.0, PRIM_FULLBRIGHT, 0, TRUE, PRIM_POSITION, llGetPos() + <.0,.0,1.0>, PRIM_ROTATION, llEuler2Rot(<270.0, 0, 180.0> * DEG_TO_RAD), PRIM_SIZE, <2.0,1.5,.06812>, PRIM_TYPE, PRIM_TYPE_BOX, 0, <0.0, 1.0, 0.0>, 0.0, <0.0, 0.0, 0.0>, <.9, .9, 0.0>, <0.0, 0.0, 0.0>]); llSetLinkPrimitiveParams(2,[PRIM_COLOR, ALL_SIDES, <.4,.4,.4>, 1.0, PRIM_COLOR, 0, <1.0,1.0,1.0>, 1.0, PRIM_TEXTURE, ALL_SIDES, "819d87ad-913d-37a7-1edf-d269f3bbb624", <8.9,.8,0.0>, <0.0,0.0,0.0>,0.0, PRIM_TEXTURE, 0, "819d87ad-913d-37a7-1edf-d269f3bbb624", <1.0,1.0,.0>, <0.0,0.0,0.0>,0.0, PRIM_FULLBRIGHT, 0, TRUE, PRIM_POSITION, <.0,.0,.002>, PRIM_ROTATION, llEuler2Rot(<270.0, 0, 180.0> * DEG_TO_RAD), PRIM_SIZE, <1.8,1.35,.06812>, PRIM_TYPE, PRIM_TYPE_BOX, 0, <0.0, 1.0, 0.0>, 0.0, <0.0, 0.0, 0.0>, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>]); llRemoveInventory(llGetScriptName()); } }
Le script s'auto-détruit à la fin de son œuvre de façonnage.
Maintenant que vous avez le panneau mettez dedans quelques textures, au moins 3 sinon ça marchera pas.
Ensuite mettez ce script dans le panneau :
//---------------------------------------------------------------------------------- // // Transition V1.0 // // Bestmomo Lagan // //---------------------------------------------------------------------------------- // //---------------------------------------------------------------------------------- // LIBRARY FUNCTIONS //----------------------------------------------------------------------------------
// -- Génération d'un entier aléatoire -- // @ param [integer] Valeur maximale // @ return [integer] entier aléatoire integer randInt(integer n) {return (integer)llFrand(n + 1);}
//--------------------------------------------------------------- // MENU FUNCTIONS //---------------------------------------------------------------
// -- Initialisation menu -- // @ param [key] clé de l'avatar // @ param [string] texte pour le menu // @ param [list] noms des boutons // @ param [integer] type de menu InitMenu(key id, string texte, list boutons, integer typemenu) { // Mise en route du timer if(iMode == MODE_OFF) llSetTimerEvent(TIMEOUT); llResetTime(); // Enregistrement des paramètres lBoutonsMenu = boutons; iCanalMenu = GetRandomChannel(); sTexteMenu = texte; iIndexMenu = 0; iBusy = TRUE; iTypeMenu = typemenu; kAvaMenu = id; // Mise en place et enregistrement de l'écoute iEcouteMenu = llListen(iCanalMenu, "", id, ""); // Envoi du menu GestMenu(); }
// -- Gestion de l'index des boutons du menu -- // @ param [string] bouton de déplacement GestIndexBoutons(string browse) { // Nombre de boutons integer n = llGetListLength(lBoutonsMenu); // Navigation simple pour deux pages if(n < 23) { if(iIndexMenu) iIndexMenu = 0; else iIndexMenu = 11;} // Navigation riche pour plus de deux pages else { if(browse == NEXT) { iIndexMenu += 10; if(iIndexMenu >= n) iIndexMenu = 0;} else { iIndexMenu -= 10; if(iIndexMenu < 0) iIndexMenu = n - n % 10;} } // Mise en route du timer if(iMode == MODE_OFF) llSetTimerEvent(TIMEOUT); llResetTime(); // Envoi du menu GestMenu(); }
// -- Gestion menu -- GestMenu() { // Liste globale des boutons list lBoutons = lBoutonsMenu; // Nombre total de boutons integer n = llGetListLength(lBoutonsMenu); // Si plusieurs pages if(n > 12) { // Que 2 pages -> navigation simple if(n < 23) { // Deuxième page if(iIndexMenu) lBoutons = [PREVIOUS] + llList2List(lBoutonsMenu, iIndexMenu, -1); // Première page else lBoutons = llList2List(lBoutonsMenu, 0, 1) + [NEXT] + llList2List(lBoutonsMenu, 2, 10);} // Plus de 2 pages -> navigation riche else { list l = [PREVIOUS, llList2String(lBoutonsMenu, iIndexMenu), NEXT]; // Première page ou page intermédiaire if(n - iIndexMenu > 10) lBoutons = l + llList2List(lBoutonsMenu, iIndexMenu + 1, iIndexMenu + 9); // Dernière page else { if(iIndexMenu + 1 < n) lBoutons = l + llList2List(lBoutonsMenu, iIndexMenu + 1, -1); else lBoutons = l;} } } // Envoi du menu llDialog(kAvaMenu, sTexteMenu, lBoutons, iCanalMenu); }
// -- Suppression d'un menu -- CancelMenu() { // On teste s'il y a quelque chose à arrêter if(iEcouteMenu) { // Arrêt de l'écoute du canal llListenRemove(iEcouteMenu); iEcouteMenu = 0; // Libération du menu iBusy = FALSE; // On arrête le timer if(iMode == MODE_OFF) llSetTimerEvent(.0);} }
// -- Fin du délai d'écoute des menu -- FinMenu() { // On prévient l'avatar llInstantMessage(kAvaMenu, "Time out for dialog."); // On supprime le menu CancelMenu(); }
// -- Fonction qui génère un canal au hasard (négatif) -- // @ return [integer] retourne le canal integer GetRandomChannel() { return ~(integer)llFrand((float)DEBUG_CHANNEL); }
//---------------------------------------------------------------------------------- // LIBRARY VARIABLES //----------------------------------------------------------------------------------
//---------------------------------------------- // MENUS //---------------------------------------------- string PREVIOUS = "<<<"; // Bouton pour page arrière string NEXT = ">>>"; // Bouton pour page avant float TIMEOUT = 30.0; // Délai pour réponse au menu
integer iCanalMenu; // Canaux du Chat integer iEcouteMenu; // Handle de l'écoute integer iIndexMenu; // Index de position dans les boutons integer iTypeMenu; // Type de menu integer iBusy; // Menu occupé string sTexteMenu; // Texte pour le menu list lBoutonsMenu; // Boutons du menu key kAvaMenu; // Clé de l'avatar
//---------------------------------------------------------------------------------- // SCRIPT FUNCTIONS //----------------------------------------------------------------------------------
//---------------------------------------------- // MENUS //----------------------------------------------
// -- Création du menu général -- // @ param [key] clé de l'avatar Menu_Main(key id) { list l = MENU_MAIN; // Bouton marche/arrêt if(iMode != MODE_OFF) l += "Off"; else l += "On"; // Affichage du menu InitMenu(id, "\nSelect an option", l, TYPE_MENU_MAIN); }
// -- Menu Settings -- Menu_Settings(key id) { list l = MENU_SETTINGS; // Mode Random ou Order if(iRandom) l += "Order"; else l += "Random"; // Access si owner if(id == llGetOwner()) l += "Access"; // Affichage du menu InitMenu(id, "\nSelect an option", l, TYPE_MENU_SETTINGS); }
// -- Menu d'accès -- Menu_Access(key id) { integer i = llListFindList(ACCESS, [sAccess]); InitMenu(id, "\nAccess is now " + sAccess + "\n\nSelect another access", ["Back","Exit"] + llDeleteSubList(ACCESS, i, i), TYPE_MENU_ACCESS); }
//---------------------------------------------- // AUTRES //----------------------------------------------
// -- Test des droits d'accès -- // @ param [key] clé de l'avatar // @ return [interger] TRUE ou FALSE integer TestAccess(key id) { if(sAccess == "Owner" && llGetOwner() == id) return TRUE; else if(sAccess == "Group" && llSameGroup(id)) return TRUE; else if(sAccess == "All") return TRUE; else return FALSE; }
// -- Test présence au moins 3 images -- // @ return [integer] TRUE ou FALSE integer Test_3_Images() { integer i = llGetInventoryNumber(INVENTORY_TEXTURE) > 2; if(i) return TRUE; else { llSay(0, "Sorry i need at least 3 textures to work !"); return FALSE; } }
// -- Mise en place d'une texture -- // @ param [integer] numéro primitive // @ param [integer] face primitive // @ param [integer] index texture Place_Texture(integer prim, integer face, integer idTexture) { llSetLinkTexture(prim, llGetInventoryName(INVENTORY_TEXTURE, idTexture), face); }
// -- Mise en place initiale -- Init() { if(Test_3_Images()) { // Fonctionnement aléatoire if(iRandom) { integer i; integer n = llGetInventoryNumber(INVENTORY_TEXTURE) - 1; integer p = randInt(n); // Index aléatoires for(; i < 2; ++i) { while(~llListFindList(lTextures, [p])) p = randInt(n); lTextures += p; } } // Fonctionnement ordonné else { lTextures = [0,1,2]; iIndex = 2; } // Mise en place des textures Place_Texture(PRIM_ECRAN, FACE_ECRAN, llList2Integer(lTextures, 0)); Place_Texture(PRIM_BASE, FACE_BASE, llList2Integer(lTextures, 1)); Place_Texture(PRIM_ECRAN, FACE_PRELOAD, llList2Integer(lTextures, 2)); } }
// -- Mise en route -- Go() { if(Test_3_Images()) { iMode = MODE_SHOW; // Mise en marche du timer llSetTimerEvent(fTimeShow); } }
// -- Initialisation de la transition -- Init_Change() { iMode = MODE_TRANS; // Calcul du pas fAlphaPas = fTempsBase / fTimeTrans; // Initialisation alpha fAlpha = 1.0; // Réglage timer llSetTimerEvent(fTempsBase); }
// -- Changement d'image -- Change() { // Diminution de l'alpha de l'écran fAlpha -= fAlphaPas; if(fAlpha > .0) llSetLinkAlpha(PRIM_ECRAN, fAlpha, FACE_ECRAN); else { // Réglage du timer llSetTimerEvent(fTimeShow); // Changement du mode iMode = MODE_SHOW; // Ecran transparent llSetLinkAlpha(PRIM_ECRAN, .0, FACE_ECRAN); // Mise en place image sur l'écran Place_Texture(PRIM_ECRAN, FACE_ECRAN, llList2Integer(lTextures, 1)); // Petit délai de chargement llSleep(.2); // Nombre de textures integer n = llGetInventoryNumber(INVENTORY_TEXTURE) - 1; // Affichage de l'écran llSetLinkAlpha(PRIM_ECRAN, 1.0, FACE_ECRAN); // Mise en place image sur la base cachée Place_Texture(PRIM_BASE, FACE_BASE, llList2Integer(lTextures, 2)); // Mise à jour de la liste des textures lTextures = llListReplaceList(lTextures, llList2List(lTextures, 1, 2), 0, 1); lTextures = llDeleteSubList(lTextures, 2, 2); // Fonctionnement aléatoire if(iRandom) { integer p = randInt(n); while(~llListFindList(lTextures, [p])) p = randInt(n); lTextures += p; Place_Texture(PRIM_ECRAN, FACE_PRELOAD, p); } // Fonctionnement ordonné else { if(++iIndex > n) iIndex = 0; lTextures += iIndex; Place_Texture(PRIM_ECRAN, FACE_PRELOAD, iIndex); } } }
// -- Arrêt -- Off() { iMode = MODE_OFF; // Arrêt du timer if(iEcouteMenu) llSetTimerEvent(TIMEOUT); else llSetTimerEvent(.0); }
//-------------------------------------------------------------------------------------- // VARIABLES GLOBALES //--------------------------------------------------------------------------------------
//---------------------------------------------- // PARAMETRES //---------------------------------------------- string VERSION = "1.0"; integer PRIM_BASE = 1; // Numéro de la primitive de base integer PRIM_ECRAN = 2; // Numéro de la prim "écran" integer FACE_BASE = 0; // Numéro de la face de base integer FACE_ECRAN = 0; // Numéro de la face "écran" integer FACE_PRELOAD = 5; // Numéro de la face de pré-chargement
//---------------------------------------------- // MENU //---------------------------------------------- list MENU_MAIN = ["Exit","Settings"]; list MENU_SETTINGS = ["Back","Exit","Time Show","Time Trans"]; list MENU_TIME = ["Back","Exit","2s","5s","10s","20s","30s","40s","50","60s","120s","240s"]; list ACCESS = ["Owner","Group","All"];
//---------------------------------------------- // VALEURS //---------------------------------------------- integer TYPE_MENU_MAIN = 0; integer TYPE_MENU_ACCESS = 1; integer TYPE_MENU_SETTINGS = 2; integer TYPE_MENU_TIMESHOW = 3; integer TYPE_MENU_TIMETRANS = 4;
integer MODE_OFF = 0; integer MODE_SHOW = 1; integer MODE_TRANS = 2;
//---------------------------------------------- // AUTRES //---------------------------------------------- integer iMode; // Mode de fonctionnement integer iRandom; // Mode Random integer iIndex; // Index en mode ordonné string sAccess = "Owner"; // Accès float fTimeShow = 10.0; // Durée de présence image float fTimeTrans = 5.0; // Durée de transition float fTempsBase = .02; // Temps de base float fAlphaPas; // Pas de changement de l'alpha float fAlpha; // Valeur de l'alpha list lTextures; // Liste des index des 3 textures
//-------------------------------------------------------------------------------------- // STATE default //-------------------------------------------------------------------------------------- default { state_entry() { // Message llWhisper(0, "Transition V"+ VERSION + " ready"); // Initialisation Init(); }
changed(integer change) { if(change & CHANGED_INVENTORY) Init(); } touch_start(integer total_number) { key k = llDetectedKey(0); if(TestAccess(k) == FALSE) llInstantMessage(k, "Sorry no access for you."); else { if(iBusy && k != kAvaMenu) llInstantMessage(k, "Sorry but the menu is busy."); else Menu_Main(k); } }
listen(integer channel, string name, key id, string message) { // Test de changement de page pour navigation if(llListFindList([PREVIOUS,NEXT], [message]) != -1) GestIndexBoutons(message); // Traitement du bouton choisi CancelMenu(); if(message == "Exit") return; else { // Traitement menu général if(iTypeMenu == TYPE_MENU_MAIN) { if(message == "On") Go(); else if(message == "Off") { iMode = MODE_OFF; Off();} else if(message == "Settings") Menu_Settings(id); } // Gestion du menu Settings else if(iTypeMenu == TYPE_MENU_SETTINGS) { if(message == "Back") Menu_Main(id); else if(message == "Access") Menu_Access(id); else if(message == "Random") { iRandom = TRUE; Menu_Settings(id);} else if(message == "Order") { iRandom = FALSE; Menu_Settings(id);} else if(message == "Time Show") InitMenu(id, "\nSelect a time for time show", MENU_TIME, TYPE_MENU_TIMESHOW); else if(message == "Time Trans") InitMenu(id, "\nSelect a time for time trans", MENU_TIME, TYPE_MENU_TIMETRANS); } // Gestion menu Access else if(iTypeMenu == TYPE_MENU_ACCESS) { // Retour au menu général if(message == "Back") Menu_Settings(id); // Mise à jour de l'accès else { sAccess = message; Menu_Settings(id);} } else { if(message == "Back") Menu_Settings(id); else { // Gestion menus Time if(iTypeMenu == TYPE_MENU_TIMESHOW) fTimeShow = (float)message; else if(iTypeMenu == TYPE_MENU_TIMETRANS) fTimeTrans = (float)message; Menu_Settings(id); } } } }
timer() { if(iEcouteMenu && llGetTime() > TIMEOUT) FinMenu(); if(iMode == MODE_SHOW) Init_Change(); else if(iMode == MODE_TRANS) Change(); } }
Et voilà c'est prêt. Vous n'avez plus qu'à cliquer sur le panneau pour avoir le menu et toutes ses options.
J'ai pas mal commenté le script pour ceux et celles qui veulent comprendre le fonctionnement.
|