[resolu] porte coulissante

Répondre
Partager Rechercher
bonjour, je cherche a faire pour ma maison, une porte coulissante a double battant (style japonais). j'ai trouvé un script qui vas bien, mais la translation se fait:
- dans le sens que je veux,
- légèrement de biais par rapport a la maison comme si la porte sortait de ses rails lors de son déplacement....
c'est ce déplacement qui me gène...

voici le script en question:

float gOpenTime = 1.0;
integer gSteps = 3;
vector gOffset = <0.7, 0.0, -0.0>;
default
{
touch_start(integer total_number)
{
integer i;
vector localpos = llGetLocalPos();
//llWhisper(0, "localpos = " + (string)localpos);
for (i = 0; i < gSteps; i++)
{
// set the object's position
llSetPos(localpos + i*gOffset);
llSleep(0.1);
}
// now, flip the offset vector to move us back down
gOffset *=-1;
}
}

j'avoue ne pas comprendre grand chose en script, mais il me semble avoir compris que:vector gOffset = <0.7, 0.0, -0.0>; représente les coordonnées de déplacement or je ne vois rien qui explique ce décalage...

ps: quand je teste la porte seule contre une prim autre que ma maison, son déplacement est rectiligne...

Dernière modification par frantika ; 26/11/2013 à 07h19.
Citation :
Publié par Poisson.Soluble
Aïe, j'espère que je ne t'ai pas tout fait casser pour rien
nikel! tout était de traviole, j'ai fait des jolis angles droits, des épaisseurs de mur régulières....
merci beaucoup!
Bravo Poisson ! Néanmoins le script est pas trop joli et le déplacement date de l'époque où on pouvait pas trop faire autrement, je te l'ai un peu arrangé. L'offset de déplacement est réglé automatiquement à la largeur de la porte mais ça peut se changer si ça va pas :

Code PHP:

float gTranslateTime 4.0;
integer gSteps 30;
float f_sens 1.0;
default
{
    
touch_start(integer total_number)
    {
        
integer i;
        
vector localpos llGetLocalPos();
        
vector v_size llGetScale();
        
vector v_largeur_porte = <v_size.x00>;
        
vector v_step = (v_largeur_porte gSteps) * f_sens;
        
float f_time gTranslateTime gSteps;
        for (; 
gStepsi++)
        {
            
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POS_LOCALlocalpos v_step]);
            
llSleep(f_time);
        }
        
f_sens *= -1;
    }

Le temps de translation est fixé par la valeur de la variable gTranslateTime.
Bonjour...petite solution de rechange amusante en 1 prim qui joue sur le biseautage d' un cube creux.....
Code PHP:

integer Pitch 10;//nombre d' etapes d' ouverture fermeture
float IntervalTime 5.0;//temporisation de la fermeture automatique
integer flag__;
//  dimensions de la porte
float largeur 2.5;
float hauteur 3.0;
float epaisseur =0.01;
vector taille = <largeur,hauteur,epaisseur>;
 
float vit_ouv_ferm 0.1;//vitesse d'ouverture fermeture en secondes...0.0 est le plus rapide  (intervale entre deux etapes de fermeture ou ouverture
Open()
{
    
flag__ TRUE;
    
llTriggerSound("6e1c02a9-559b-c217-3b87-efe53edef9d6"1.0);
    
integer i;
    for(
0Pitch 1i++)
    {
        
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TYPE00, <0.01.00.0>,
        
0.949, <0.00.00.0>, <(float)i/Pitch1.00.0>,
        <
0.00.00.0>]);
        
llSleep(vit_ouv_ferm);   
    }
    
llSetTimerEvent(IntervalTime);
}
Close()
{
    
llSetTimerEvent(0);
    
flag__ FALSE;
    
llTriggerSound("6e1c02a9-559b-c217-3b87-efe53edef9d6"1.0);
    
integer i;
    for(
Pitch 1>= i--)
    {
        
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TYPE00, <0.01.0.0>,
        
0.949, <0.00.00.0>, <(float)i/Pitch1.00.0>,
        <
0.00.00.0>]);
        
llSleep(vit_ouv_ferm);
    }
}
TouchOpen()
{
    if(
flag__ == FALSE)
    {
        
Open();
    }
    else
    {
        
Close();
    }
}
CollideOpen()
{
    if(
flag__ == FALSE)
    {
        
Open();
    }
    else
    {
        
llSetTimerEvent(IntervalTime);
    }
}
Init()
{
    
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_MATERIALPRIM_MATERIAL_GLASSPRIM_SIZEtaille,
    
PRIM_TYPE00, <0.01.00.0>, 0.949, <0.00.00.0>, <0.01.00.0>, <0.00.00.0>,
    
PRIM_FULLBRIGHTALL_SIDESTRUEPRIM_ROTATION, <0.7000.7>,
    
PRIM_COLORALL_SIDES, <0.00.00.0>, 1.0PRIM_POSITIONllGetPos() + (<001.1> * llGetRot()),
    
PRIM_TEXTUREALL_SIDES"c8ac31b4-627f-472f-20cf-ef3bf9647212",
    <
1.01.00.0>, <0.00.00.0>, 0.0]);
}
default
{
    
state_entry()
    {
        
Init();
    }
    
changed(integer change)
    {
        if(
change CHANGED_OWNER)
        {
            
llResetScript();
        }
    }
    
touch_start(integer total_number)
    {
        
TouchOpen();
    }
    
collision_start(integer num_detected)
    {
        
CollideOpen();
    }
    
timer()
    {
        
Close();
    }


Sinon, pour faire une porte double du script de Best, il suffit de faire deux portes en inversant le sens d' ouverture, de les linker autre qu' en root, et d' inclure un llMessageLinked de l' un battant à l 'autre pour qu'un clic sur l' un d' eux declenche l'ouverture des deux.
Attention si tu poses plusieurs portes doubles à bien changer le message, sinon un clic declenche l' ouverture de toutes les portes doubles du linkset.
Citation :
Publié par MenthalOH
Sinon, pour faire une porte double du script de Best, il suffit de faire deux portes en inversant le sens d' ouverture, de les linker autre qu' en root, et d' inclure un llMessageLinked de l' un battant à l 'autre pour qu'un clic sur l' un d' eux declenche l'ouverture des deux.
Attention si tu poses plusieurs portes doubles à bien changer le message, sinon un clic declenche l' ouverture de toutes les portes doubles du linkset.
oups, pour lier les portes, je fait (par ex) dans l'ordre: porte d puis porte g puis maison?
et le llmessageLinked je fait comment pour: " inclure un llMessageLinked de l' un battant à l 'autre"... parceque, c'est vrai que c'est une bonne idée un click pour les deux portes...

voici le script que j'ai pour mes portes (en fait, deux scripts que j'ai mélangés):

key xxx = "cléd'identificationxxx";
key yyy = "cléd'identificationyyy";
integer open = FALSE;
float gOpenTime = 1.0;
integer gSteps = 3;
vector gOffset = <0.0, 0.7, 0.0>;
default
{
touch_start(integer total_number)
{
key id = llDetectedKey(0);
if(id == xxx || id == yyy)
{
integer i;
vector localpos = llGetLocalPos();
//llWhisper(0, "localpos = " + (string)localpos);
for (i = 0; i < gSteps; i++)
{
// set the object's position
llSetPos(localpos + i*gOffset);
llSleep(0.1);
}
// now, flip the offset vector to move us back down
gOffset *=-1;
llSay(0, "bienvenue " + llKey2Name(id));
}
else
{
string intru = llKey2Name(id);
llSay(0, intru + " tu rêves tu rentreras pas!!!");
llInstantMessage(xxx, "il y à " + intru + " qui veut rentrer chez toi");
llInstantMessage(yyy, "il y à" + intru + " qui veut rentrer chez toi");
}
}
}


l'autre battant a un déplacement vector gOffset = <0.0, -0.7, 0.0>;

j'ai mis 0.7 de déplacement pour que la porte ne se déplace pas de sa largeur exacte...
Rebonjour....pour le linkage c 'est ça...aucune porte ne doit jamais être linkée en dernier....sinon, pour mes portes doubles, j 'utilise ça...pour une porte
Code PHP:

vector decalage = <0.0,1.0,0.0>; //distance d'ouverture sur y
vector posFerme;
vector posOuvert;
integer Ouvert;
ouvert()
{
     
llPlaySound("34c9a0b4-5820-0eb3-a639-61dcd5bb7f2b",0.8);
    
llSetPos(posOuvert);
    
Ouvert TRUE;
}
ferme()
{
    
llPlaySound("34c9a0b4-5820-0eb3-a639-61dcd5bb7f2b",0.8);
    
llSetPos(posFerme);
    
Ouvert FALSE;
}
 
default
{
    
state_entry()
    {
        
posFerme llGetLocalPos();
        
posOuvert posFerme  decalage;
    }
    
link_message(integer senderinteger numberstring messagekey id)
    {
        if (
message == "ouvre"
        {
            
ouvert();
            
state open;
        }
    }
    
touch_start(integer num_detected)
    {
        
llMessageLinked(LINK_SET0"ouvre""");
    }
}
state open
{
    
state_entry()
    {
        
llSetTimerEvent(5.0);
    }
    
touch_start(integer num_detected)
    {
        
llMessageLinked(LINK_SET0"ferme""");
    }
 
    
timer()
    {
      
llMessageLinked(LINK_SET0"ferme""");
    }
    
link_message(integer senderinteger numberstring messagekey id)
    {
        if (
message == "ferme"
        {
            
ferme();
            
state default;
        }
    }    


et pour l 'autre..
Code PHP:

vector decalage = <0.0,-1.0,0.0>; //distance d'ouverture sur y
vector posFerme;
vector posOuvert;
integer Ouvert;
ouvert()
{
    
llSetPos(posOuvert);
    
Ouvert TRUE;
}
ferme()
{
    
llSetPos(posFerme);
    
Ouvert FALSE;
}
 
default
{
    
state_entry()
    {
        
posFerme llGetLocalPos();
        
posOuvert posFerme  decalage;
    }
    
link_message(integer senderinteger numberstring messagekey id)
    {
        if (
message == "ouvre"
        {
            
ouvert();
            
state open;
        }
    }
    
touch_start(integer num_detected)
    {
        
llMessageLinked(LINK_SET0"ouvre""");
    }
}
state open
{
    
state_entry()
    {
    }
     
touch_start(integer num_detected)
    {
        
llMessageLinked(LINK_SET0"ferme""");
    }
    
timer()
    {
      
llMessageLinked(LINK_SET0"ferme""");
    }
    
link_message(integer senderinteger numberstring messagekey id)
    {
        if (
message == "ferme"
        {
            
ferme();
            
state default;
        }
    }    

Bonjour,

Je n'y connais rien en script mais il y en a un en full perm et freebies pour les portes coulissantes double.
A côté du café jol, j'ai posé pour le moment un ancien studio photo et vous pouvez tester les portes, c'est impec même avec textures.
Je l'avais modifié [à l'époque] mais peut-être que cela peut vous servir, je ne sais pas comment copier un script mais voilà C'est peut-être totalement inutile... ne sait-on jamais.

//This Script was pulled out for you by YadNi Monde from the SL FORUMS at http://forums.secondlife.com/forumdisplay.php?f=15, it is intended to stay FREE by it s author(s) and all the comments here in ORANGE must NOT be deleted. They include notes on how to use it and no help will be provided either by YadNi Monde or it s Author(s). IF YOU DO NOT AGREE WITH THIS JUST DONT USE!!!
//********************************************************




//1 prim double sliding glass door was made by Seagel Neville as public domain, Nov 2006
//
//Hello there,
//
//This is 1 prim double sliding glass door.
//Just put this script into a prim.
//You can open it by touching or bumping.
//For security, it is locked when you keep touching for a while. Just the owner can open it. It toggles.
//After being rezzed, you can modify scale, color, and alpha. I don't recommend you post a texture on it because it has complicated faces.

integer pitch = 5;
float TimeInterval = 3.0;
integer TouchFlag;
integer Holding;
integer SecureFlag;
Open()
{
TouchFlag = TRUE;
llTriggerSound("de7ac1a3-f31b-e1a4-5a21-5b9907921bf1", 1.0);
integer i;
for(i = 0; i < pitch + 1; i++)
{
llSetPrimitiveParams([PRIM_TYPE, 0, 0, <0.000000, 1.000000, 0.000000>,
0.949000, <0.000000, 0.000000, 0.000000>, <(float)i/pitch, 1.000000, 0.000000>,
<0.000000, 0.000000, 0.000000>]);
}
llSetTimerEvent(TimeInterval);
}
Close()
{
llSetTimerEvent(0);
TouchFlag = FALSE;
llTriggerSound("44f32d82-8604-1f29-37c9-a35baec646ee", 1.0);
integer i;
for(i = pitch - 1; i >= 0 ; i--)
{
llSetPrimitiveParams([PRIM_TYPE, 0, 0, <0.000000, 1.000000, 0.000000>,
0.949000, <0.000000, 0.000000, 0.000000>, <(float)i/pitch, 1.000000, 0.000000>,
<0.000000, 0.000000, 0.000000>]);
}
}
TouchOpen()
{
if(TouchFlag == FALSE)
{
Open();
}
else
{
Close();
}
}
CollideOpen()
{
if(TouchFlag == FALSE)
{
Open();
}
else
{
llSetTimerEvent(TimeInterval);
}
}
Init()
{
llSetPrimitiveParams([PRIM_MATERIAL, PRIM_MATERIAL_GLASS, PRIM_SIZE, <2.0, 2.7, 0.01>,
PRIM_TYPE, 0, 0, <0.0, 1.0, 0.0>, 0.949, <0.0, 0.0, 0.0>, <0.0, 1.0, 0.0>, <0.0, 0.0, 0.0>,
PRIM_FULLBRIGHT, ALL_SIDES, TRUE, PRIM_ROTATION, <0.7, 0, 0, 0.7>,
PRIM_COLOR, ALL_SIDES, <0.0, 0.0, 0.5>, 0.5, PRIM_POSITION, llGetPos() + (<0, 0, 1.1> * llGetRot()),
PRIM_TEXTURE, ALL_SIDES, "5748decc-f629-461c-9a36-a35a221fe21f",
<1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, 0.0]);
}
default
{
state_entry()
{
Init();
}
changed(integer change)
{
if(change & CHANGED_OWNER)
{
llResetScript();
}
}
touch(integer total_number)
{
if(llDetectedKey(0) == llGetOwner())
{
Holding++;
if(Holding == 50)
{
if(SecureFlag == FALSE)
{
llOwnerSay("Secured mode has been ON");
SecureFlag = TRUE;
}
else
{
llOwnerSay("Secured mode has been OFF");
SecureFlag = FALSE;
}
}
}
}
touch_end(integer total_number)
{
Holding = 0;
if(SecureFlag == FALSE)
{
TouchOpen();
}
else
{
if(llDetectedKey(0) == llGetOwner())
{
TouchOpen();
}
else
{
llWhisper(0, "Sorry, this door is beeing locked.");
}
}
}
collision_start(integer num_detected)
{
if(SecureFlag == FALSE)
{
CollideOpen();
}
else
{
if(llDetectedKey(0) == llGetOwner())
{
CollideOpen();
}
else
{
llWhisper(0, "Sorry, this door is beeing locked.");
llSleep(5.0);
}
}
}
timer()
{
Close();
}
}
Répondre

Connectés sur ce fil

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