Script blinking eyes

Répondre
Partager Rechercher
Bonjour,

J'ai créer 2 prim en sphère et mis un système de glissement de texture par changement d'offset. Puis j'ai lié les 2 prims sphere. (en gros j'ai une texture carré avec dedans un coin avec loeil fermé et le reste transparent)

Ce qui fait que chaque oeil fait un clignement. Sauf que quand ca lag les 2 yeux ne sont pas synchro.

J'aimerais savoir comment faire pour que mes 2 yeux soit toujours synchro, par ex quand le script oeil gauche fini il se reset et demande le reset de l oeil droit a chaque nouveau cycle.

J'ai testé un peu tout mais mes connaissances des script sont proche du "copier coller", alors si vous pouviez me donner qq exemples ou alors le script complet ...

J'ai fait des test avec des listen et say mais bon apparemment un prim qui llsay n'est pas entendu par l'autre.


Merci
Voila VOILA
SALUT J AI CA SI CA TE CONVIENDS APRES DEMANDE MOI DANS SL J AURAIS DEUX TEXTURES QUI VAS AVEC CE SCRIPT A TE DONNER J AI LE MEME NOM SL
N HESITE PAS A BIENTOT


// This blink script uses a single texture with the frames set up as follows within the image.
//
// +-----+-----+
// | 1 | 2 |
// +-----+-----+
// | 3 | 4 |
// +-----+-----+
// The minimum time between blinks
float minBlinkTime = 0.5; // in seconds
// The Maximum time between blinks
float maxBlinkTime = 12.0; // in seconds
// The animation frame speed
float animationSpeed = 7; // in fps
// number of frames in the animation
integer numberFrames = 4;
// temporary variable
float waitTime;

// Returns a reandom number between min and max
float randBetween(float min, float max)
{
return llFrand(max - min) + min;
}

default
{
// Main part of the program
state_entry()
{
// Sets the size and position of the default frame
llOffsetTexture(0.25,0.25,ALL_SIDES);
llScaleTexture(0.5,0.5,ALL_SIDES);
// Intialize time even
llSetTimerEvent(randBetween(minBlinkTime,maxBlinkTime));
waitTime = (numberFrames * 2) / animationSpeed;
}

// Timer event
timer()
{
// Temporarily turn off the timer event
llSetTimerEvent(0.0);
// Animate the eyes onces.
llSetTextureAnim(ANIM_ON|PING_PONG,ALL_SIDES,2,2,1,4,animationSpeed);
// Wait for the eyes to finish animating
llSleep(waitTime);
// Turn off animation
llSetTextureAnim(FALSE,ALL_SIDES,2,2,1,4,animationSpeed);
// Reset Timer for next event
llSetTimerEvent(randBetween(minBlinkTime,maxBlinkTime));
}
}
Citation :
Publié par Adelinepi
Bonjour,

J'ai créer 2 prim en sphère et mis un système de glissement de texture par changement d'offset. Puis j'ai lié les 2 prims sphere. (en gros j'ai une texture carré avec dedans un coin avec loeil fermé et le reste transparent)

Ce qui fait que chaque oeil fait un clignement. Sauf que quand ca lag les 2 yeux ne sont pas synchro.

J'aimerais savoir comment faire pour que mes 2 yeux soit toujours synchro, par ex quand le script oeil gauche fini il se reset et demande le reset de l oeil droit a chaque nouveau cycle.

J'ai testé un peu tout mais mes connaissances des script sont proche du "copier coller", alors si vous pouviez me donner qq exemples ou alors le script complet ...

J'ai fait des test avec des listen et say mais bon apparemment un prim qui llsay n'est pas entendu par l'autre.


Merci
Bien qu on ne puisse pas éviter le lag , on peut changer son effet sur le script , en effet .

Tu peux faire dans le même appel de fonction ton changement pour ton oeil droit et ton changement pour ton oeil gauche .
Ainsi , cela te garantit qu ils changeront en même temps , parce que la foncton est "indivisible" . Si il y a du lag , c est la paire d yeux en entier qui aura son clignotement décalé et non pas un seul oeil .
Visuellement , il vaut mieux que ce soit ta paire d yeux qui ait son clignotement de décalé , plutôt qu un seul oeil aléatoirement

Pour changer 2 prims dans le même appel , tu peux utiliser
llSetLinkPrimitiveParamsFast avec l option PRIM_LINK_TARGET .
L option PRIM_LINK_TARGET existe aussi pour les fonction llGetLinkPrimitiveParams et llSetSetLinPrimitiveParams.
http://wiki.secondlife.com/wiki/PRIM_LINK_TARGET

PRIM_LINK_TARGET , est suivi d un numero de prim , puis de paramètres indiquant quel changement faire pour cette prim.
On peut donc se contruire une liste finale qui change plusieurs prims en même temps .




Exemple :
Code PHP:

// la liste parametres vaut
list parametres =
// les changements de texture pour la prim numero 1
PRIM_LINK_TARGET 1PRIM_TEXTUREfacetextureuuidrepeatsoffsetrot ]
+
// les changements de texture  pour la prim numero 2
PRIM_LINK_TARGET 2PRIM_TEXTUREfacetextureuuidrepeatsoffsetrot ];

// appel indivisible
llSetLinkPrimitiveParamsFast(LINK_THISparametres); 
Tu n as pas besoin de listeners . Tout se fait dans le même script


Dans la mesure du possible , on utilise des textures animées , comme dans le script de eldiablo .
Idem , il faut essayer de se ramener à plusieurs changements simultanés dans la même fonction .

On ne peut malheureusement pas sélectionner un ensemble de plusieurs prims grâce a une option PRIM_LINK_TARGET . Mais on peut néanmoins lancer l animation sur toutes les prims en même temps

Dans ce cas , il ne faudra pas appeler llSetTextureAnim mais appeler
llSetLinkTextureAnim http://wiki.secondlife.com/wiki/LlSetLinkTextureAnim

Si tu utilises des textures animées :
alors
Code PHP:

// Lance l animation sur toutes les prims 
 
llSetLinkTextureAnimLINK_SET modeface, , sizeystartlengthrate );

// ou  lance l animation sur toutes les prims sauf la prim root
 
llSetLinkTextureAnimLINK_ALL_CHILDREN    modeface, , sizeystartlengthrate );

// ou  lance l animation sur toutes les prims sauf la prim dans laquele se trouve le script
 
llSetLinkTextureAnimLINK_ALL_OTHERS    modeface, , sizeystartlengthrate ); 

Dernière modification par redpurple ; 03/05/2013 à 10h48.
Coucou merci de vos réponses, je suis en train de regarder chacune de vos réponse (je suis Maryline Pinion in game)

Mon script actuel est celui la :

Code PHP:

// SCRIPT_NAME = "animated texture-simple";
// DESCRIPTION = "animated the texture my offseting the texture at intervals";
 


// global variables
integer gCellsAcross 2;
integer gCellsDown  2;
// seconds between cells
float gSwitchTime  0.001;
float gOffsetU;
float gOffsetV;
float gScaleU;
float gScaleV;

key gKey;
vector gScale;


// all scripts start in the default state
default
{

    
    
//this state will allow colors to be set
    
state_entry()
    {

        
gScaleU 1/(float)gCellsAcross;
        
gScaleV 1/(float)gCellsDown;
        
// U range is -0.5 to 0.5 left to right
        // V range is 0.5 to -0.5 top to bottom
        // divided by 2 to put focus at the center of the cell
        
gOffsetU = -0.5 gScaleU 2;
        
gOffsetV 0.5 gScaleV 2
// next line automatically scales the texture
//        llScaleTexture(gScaleU, gScaleV, -1);

// next line focuses the texture on the last cell - for use if this is a click-started animation
//        llOffsetTexture(0.5-gScaleU/2, -0.5+gScaleV/2, -1);

        
state Movie;
    }

}

state Movie
{
    
state_entry()
    {
    
integer i;
    
integer j;
    
integer k;
    
float OffsetU;
    
float OffsetV;
    @
Loophere;
    
// set local offset variables equal to global offset constants
    
OffsetU gOffsetU;
    
OffsetV gOffsetV;

    for (
i=0i<gCellsDowni++)
    {
                
        for (
j=0j<gCellsAcrossj++)
        {

            
llOffsetTexture(OffsetUOffsetV, -1);
            
llSleep(gSwitchTime);
            
OffsetU OffsetU gScaleU;
        }
        
OffsetU OffsetU 1.0;      
        
OffsetV OffsetV gScaleV;           
      
    }
    
llSleep(5.0);
//    llSay(0,"resetblinkright");
    
jump Loophere;
}
           

Comme tu le vois mon script est un système comme celui de eldiablo sur un offset de la même texture, ce script est le même sur les 2 yeux (comprendre les 2 prims sont lié le premier prim se charge du clignotement de l oeil gauche et le 2 ieme du droite)

Ton système de PRIM_LINK_TARGET semble le bon, par contre mon niveau est proche du 0 concernant les scripts, des choses comme appel de fonctions ou des "states" me sont très difficile a comprendre.

Dernière modification par Adelinepi ; 04/05/2013 à 03h41.
Coucou Maryline , essaye ça :

Code PHP:

// SCRIPT_NAME = "animated texture-simple";
// DESCRIPTION = "animated the texture my offseting the texture at intervals";

// Numéros de lien des yeux
integer OEIL_D 2;
integer OEIL_G 3;
// Mémorisation des données des textures
list L_OEIL_D;
list 
L_OEIL_G;

// global variables
integer gCellsAcross 2;
integer gCellsDown  2;
// seconds between cells
float gSwitchTime  0.001;
float gOffsetU;
float gOffsetV;
float gScaleU;
float gScaleV;


// all scripts start in the default state
default
{


    
//this state will allow colors to be set
    
state_entry()
    {

        
gScaleU 1/(float)gCellsAcross;
        
gScaleV 1/(float)gCellsDown;
        
// U range is -0.5 to 0.5 left to right
        // V range is 0.5 to -0.5 top to bottom
        // divided by 2 to put focus at the center of the cell
        
gOffsetU = -0.5 gScaleU 2;
        
gOffsetV 0.5 gScaleV 2;
        
// next line automatically scales the texture
        //        llScaleTexture(gScaleU, gScaleV, -1);

        // next line focuses the texture on the last cell - for use if this is a click-started animation
        //        llOffsetTexture(0.5-gScaleU/2, -0.5+gScaleV/2, -1);

        // Mémorisation des infos des textures
        
L_OEIL_D llGetLinkPrimitiveParams(OEIL_D, [PRIM_TEXTURE0]);
        
L_OEIL_G llGetLinkPrimitiveParams(OEIL_G, [PRIM_TEXTURE0]);

        
state Movie;
    }

}

state Movie
{
    
state_entry()
    {
        
integer i;
        
integer j;
        
float OffsetU;
        
float OffsetV;
        @
Loophere;
        
// set local offset variables equal to global offset constants
        
OffsetU gOffsetU;
        
OffsetV gOffsetV;

        for (
i=0i<gCellsDowni++)
        {

            for (
j=0j<gCellsAcrossj++)
            {
                
llSetLinkPrimitiveParamsFast(
                    
OEIL_D, [
                    
PRIM_TEXTURE,
                    
ALL_SIDES,
                    
llList2Key(L_OEIL_D0),
                    
llList2Vector(L_OEIL_D1),
                    <
OffsetUOffsetV0>,
                    
llList2Float(L_OEIL_D3),
                    
PRIM_LINK_TARGETOEIL_G,
                    
PRIM_TEXTURE,
                    
ALL_SIDES,
                    
llList2Key(L_OEIL_G0),
                    
llList2Vector(L_OEIL_G1),
                    <
OffsetUOffsetV0>,
                    
llList2Float(L_OEIL_G3)]
                    );

                
llSleep(gSwitchTime);
                
OffsetU OffsetU gScaleU;
            }
            
OffsetU OffsetU 1.0;
            
OffsetV OffsetV gScaleV;

        }
        
llSleep(5.0);
        
//    llSay(0,"resetblinkright");
        
jump Loophere;
    }


Mets les bons numéros de liaison de tes yeux dans le script dans les variables OEIL_D et OEIL_G . Je peux pas tester en ligne là mais ça devrait fonctionner.

Tu mets le script dans le root (un seul script qui commande les deux yeux, enlève bien ceux que tu peux avoir encore dans les yeux).

La temporisation de 0,001 seconde est un gag dans le contexte de SL mais je l'ai laissée...

Dernière modification par Sandrine repine ; 04/05/2013 à 11h52.
Bien Sandrine .
Par contre , vire moi cette boucle infinie ( @Loophere; // Sleep(5.0) // jump Loophere ) ( qui ne venait pas de ta part) , et remplace la par un timer .
C est pour cela que les tests de Adelinepi en rajoutant listen/llsay avaient échoués . Le script était coincé dans la boucle et ne pouvait pas passer à autre chose

Pour le gSwitchTime, comme il y a un délai pour llOffsetTexture de 0.2 secondes et pas de délais pour lletLinkPrimitiveParamsFast , mets le à 0.2 pour éviter que cela clignote trop rapidement

Dernière modification par redpurple ; 04/05/2013 à 14h29.
Citation :
Publié par Sandrine repine
Coucou Maryline , essaye ça :

Code PHP:

// SCRIPT_NAME = "animated texture-simple";
// DESCRIPTION = "animated the texture my offseting the texture at intervals";
.... 
Mets les bons numéros de liaison de tes yeux dans le script dans les variables OEIL_D et OEIL_G . Je peux pas tester en ligne là mais ça devrait fonctionner.

Tu mets le script dans le root (un seul script qui commande les deux yeux, enlève bien ceux que tu peux avoir encore dans les yeux).

La temporisation de 0,001 seconde est un gag dans le contexte de SL mais je l'ai laissée...
Tiens sandrine ca fait un moment que je cherchais a te joindre in game pour ca

Je regarde tout ca cet apres midi ou ce soir, merci
J'ai fait un premier test avec le script de sandrine, j'ai changé les numéro de liaisons par 1 et 2.

Ca marche direct sans virer les loophere et tout, bravo sandrine moi qui comprend pas grand chose au script tu ma apporter un script complet et qui marche.

MERCI !!! (et oui je galérais depuis qq jours)


Dernière chose: si je veux rendre ma partie llsleep (5.0); aléatoire il existe un llsleep (random); ?


http://img801.imageshack.us/img801/5266/snapshot001n.png

Dernière modification par Adelinepi ; 04/05/2013 à 18h07.
@redpurple

Oui j'ai fait ça rapidement, j'ai bien vu la boucle infinie mais je ne savais pas qu'elle gênait pour récupérer un événement par ailleurs. Pour la vitesse du clignotement j'ai pas fait attention parce que j'ai pas pu tester parce que je peux pas me connecter là.

Voilà la modif avec un timer à 5 secondes et le délai à 0,2 seconde :

Code PHP:

// SCRIPT_NAME = "animated texture-simple";
// DESCRIPTION = "animated the texture my offseting the texture at intervals";

// Numéro de lien des yeux
integer OEIL_D 2;
integer OEIL_G 3;
// Mémorisation des données des textures
list L_OEIL_D;
list 
L_OEIL_G;

// global variables
integer gCellsAcross 2;
integer gCellsDown  2;
// seconds between cells
float gSwitchTime  .2;
float gOffsetU;
float gOffsetV;
float gScaleU;
float gScaleV;


// all scripts start in the default state
default
{

    
//this state will allow colors to be set
    
state_entry()
    {

        
gScaleU 1/(float)gCellsAcross;
        
gScaleV 1/(float)gCellsDown;
        
// U range is -0.5 to 0.5 left to right
        // V range is 0.5 to -0.5 top to bottom
        // divided by 2 to put focus at the center of the cell
        
gOffsetU = -0.5 gScaleU 2;
        
gOffsetV 0.5 gScaleV 2;
        
// next line automatically scales the texture
        //        llScaleTexture(gScaleU, gScaleV, -1);

        // next line focuses the texture on the last cell - for use if this is a click-started animation
        //        llOffsetTexture(0.5-gScaleU/2, -0.5+gScaleV/2, -1);

        // Mémorisation des infos des textures
        
L_OEIL_D llGetLinkPrimitiveParams(OEIL_D, [PRIM_TEXTURE0]);
        
L_OEIL_G llGetLinkPrimitiveParams(OEIL_G, [PRIM_TEXTURE0]);

        
state Movie;
    }

}

state Movie
{
    
    
state_entry()
    {
        
llSetTimerEvent(5.0);
    }

    
timer()
    {
        
llSetTimerEvent(2.0 llFrand(3.0)); 
        
integer i;
        
integer j;
        
// set local offset variables equal to global offset constants
        
float OffsetU gOffsetU;
        
float OffsetV gOffsetV;

        for (
i=0i<gCellsDowni++)
        {
            for (
j=0j<gCellsAcrossj++)
            {
                
llSetLinkPrimitiveParamsFast(
                    
OEIL_D, [
                    
PRIM_TEXTURE,
                    
ALL_SIDES,
                    
llList2Key(L_OEIL_D0),
                    
llList2Vector(L_OEIL_D1),
                    <
OffsetUOffsetV0>,
                    
llList2Float(L_OEIL_D3),
                    
PRIM_LINK_TARGETOEIL_G,
                    
PRIM_TEXTURE,
                    
ALL_SIDES,
                    
llList2Key(L_OEIL_G0),
                    
llList2Vector(L_OEIL_G1),
                    <
OffsetUOffsetV0>,
                    
llList2Float(L_OEIL_G3)]
                        );
                
llSleep(gSwitchTime);
                
OffsetU += gScaleU;
            }
            
OffsetU -= 1.0;
            
OffsetV -= gScaleV;
        }
    }
    

Edit pour Maryline : j'ai ajouté la modif pour avoir une tempo aléatoire avec la ligne :

llSetTimerEvent(2.0 + llFrand(3.0));

Ca veut dire qu'il y a au moins 2 secondes ajoutées à une valeur aléatoire entre 0 et 3 secondes. Tu peux modifier à ta convenance.

Dernière modification par Sandrine repine ; 04/05/2013 à 18h24. Motif: Ajout tempo aléatoire
Merci a tout ceux qui m'ont répondu et en particulier a Sandrine qui ma permis d'avoir exactement ce que je voulais .

Je dois dire que c'était bien ramener a ma portée, j'ai même pu changer donc les timer et les numéro de prims comme il fallait, super !!


Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés