ascenseur

Répondre
Partager Rechercher
bonjour, je suis entrain de faire un ascenseur, il monte et descend impeccablement, mais par contre j'ai 2 soucis.
le premier, je ne sais pas comment y attacher les portes pour que elles s'ouvrent en slide du milieu vers l'extérieur; car quand je lie le tout, elles restent coller et glisse d'un seul coté, et si je les lie pas au reste, elle décolle pas biensur.
le second, je cherche a mettre un afficheur indiquant l'étage a chaque niveau, si quelqu'un avait les textures pour, ainsi que le script qui va bien avec. je vous enverrai un ptit snapshot quand il sera fini, opour un premier, je le trouve plutot pas mal
merci beaucoup
Tes portes peuvent être liées à ton ascenseur ça ne t'empêche pas de les commander indépendamment en mettant un script dedans pour leur faire subir une translation. Le seul truc est de synchroniser avec l'arrêt de la cabine.

En ce qui concerne l'afficheur j'en ai un free pas mal du tout avec les textures qui vont bien, tu peux me contacter on line : Bestmomo Lagan, j'ai aussi un exemple de script pour un jeu de bascket que j'ai fait avec (marquage de panier ^^).
merci momo pour ton afficheur, mais rien a faire, il veut pas marcher lol. sino, j'ai toujours ce probleme pour lier ma porte au reste de l'ascenseur; soit la porte fonctionne plus, quand je la lie dans un sens, soit c'est tout l'ascenseur qui part a droite quand j'active l'ouverture de la porte. comment faites vous pour lier 2 groupes de prims avec des scripts dedans, sans que tout l'ensemble subisse soit l'un ou l'autre des scripts?
Comme je te l’avais promis il y a… un certain temps… mais j’ai pas eu vraiment de disponibilité avant… j’ai un peu regardé ton script elevator aujourd’hui.

La gestion de portes d’ascenseurs n’est pas forcément évidente. En effet, il faut gérer différentes contraintes et fonctionnalités :
  • les deux portes doivent être synchronisées et l’ouverture temporisée
  • un clic sur une porte doit l’ouvrir uniquement si l’ascenseur est à l’arrêt et déclencher l’ouverture de l’autre porte
  • l’ouverture des portes doit bloquer l’ascenseur
  • la mise en marche de l’ascenseur doit bloquer les portes à la fermeture
  • l’arrêt de l’ascenseur doit débloquer les portes
Il faut trois scripts : un dans le root de l’ascenseur qui gère le déplacement de la cabine (elevator que tu m’as transmis), et un dans chaque porte pour gérer les ouvertures. Et un autre évidemment dans les boutons de commande.

Voici le script pour les portes. Ce qui différencie une porte de l’autre réside uniquement au niveau de la variable porte_droite qui est à TRUE pour une porte à droite et à FALSE pour une porte à gauche :

Code PHP:

vector largeur// Largeur de la porte
integer porte_droite TRUE// Côté de la porte
integer axe_X TRUE// Axe de translation
integer ouvert FALSE// Porte ouverte
float delai 8.0// Délai d'ouverture
// Initialisations
initialisations() {
// Dimensions de la porte
vector dimensions llGetScale();
// Largeur de la porte selon axe X ou Y
if(axe_Xlargeur = <dimensions.x,.0,.0>;
else 
largeur = <.0,dimensions.y,.0>;
if(!
porte_droitelargeur = -largeur;
}
// Ouverture de la porte
ouverture() {
// Message de blocage de l'ascenseur
llMessageLinked(LINK_ALL_OTHERS0"BLOQUE_ASCENSEUR"NULL_KEY);
// Etat de la porte
ouvert TRUE;
// Ouverture
llSetPos(llGetLocalPos() + largeur);
// Temporisation
llSetTimerEvent(delai);
}
// Etat par défaut
default {
state_entry() {
initialisations();
state arret;
}
on_rez(integer start_param) {
initialisations();
state arret;
}
}
// Ascenseur à l'arrêt
state arret {
state_entry() {
ouverture();
}
touch_start(integer total_number) {
if(!
ouvert) {
// Message d'ouverture pour l'autre porte
llMessageLinked(LINK_ALL_OTHERS0"OUVRE"NULL_KEY);
ouverture();
}
}
// Réception d'un message de mise en marche du root "GO"
// ou d'ouverture venant de l'autre porte ou du root "OUVRE"
link_message(integer sender_numberinteger numberstring messagekey id) {
if(
message == "BLOQUE_PORTES")
state marche;
else if(
message == "OUVRE")
ouverture();
}
timer() {
// Arrêt de la temporisation
llSetTimerEvent(.0);
// Fermeture
llSetPos(llGetLocalPos() - largeur);
// Etat de la porte
ouvert FALSE;
// Message pour débloquer l'ascenseur
llMessageLinked(LINK_ROOT0"DEBLOQUE_ASCENSEUR"NULL_KEY);
}
}
// Ascenseur en marche
state marche {
// Réception d'un message d'arrêt de l'ascenseur
link_message(integer sender_numberinteger numberstring messagekey id) {
if(
message == "DEBLOQUE_PORTES")
state arret;
}

Selon l’orientation de l’ascenseur l’axe de translation est différent. La variable axe_X à TRUE définit l’axe X alors qu’à FALSE c’est l’axe Y qui est concerné. Un certain nombre de messages doivent circuler entre le root et les portes et entre les portes entre elles.

Messages émis par les portes :

Message Destinataire Fonction

OUVRE -> Autre porte -> Ouverture
BLOQUE_ASCENSEUR -> Ascenseur -> Blocage
DEBLOQUE_ASCENSEUR -> Ascenseur -> Déblocage


Messages émis par l’ascenseur :

Message Destinataire Fonction

BLOQUE_PORTES -> Portes -> Blocage
DEBLOQUE_PORTES -> Portes -> Déblocage


Le script elevator doit être complété pour gérer ces messages.

Pour gérer le blocage de l’ascenseur il faut créer une variable globale appelée par exemple blocage et affecter cette variable aux moments qui vont bien.

integer blocage;

Le code suivant :

link_message(integer sender_num, integer num, string str, key id)
{
checkM(id, str);
}

doit être complété avec la variable pour gérer le blocage :

link_message(integer sender_num, integer num, string str, key id)
{
if(str =="BLOQUE_ASCENSEUR")
blocage = TRUE;
elseif(str =="DEBLOQUE_ASCENSEUR")
blocage = FALSE;
elseif(!blocage)
checkM(id, str);
}

Pour l’émission des messages de l’ascenseur il faut compléter aussi le code :

float i = travelDistance/(maxSpeed*speed);
llMoveToTarget(end,i);

avec l’envoi du message :

float i = travelDistance/(maxSpeed*speed);
llMessageLinked(LINK_ALL_CHILDREN, 0, "BLOQUE_PORTES", NULL_KEY);
llMoveToTarget(end,i);

Et pour le déblocage le code suivant :

//Arrived at Floor
llWhisper(0, "Arrived at floor #" + (string)(targetFloor+1));
llPlaySound("ElevatorNoises", 1);
llSetTimerEvent(0);

avec l’envoi du message :

//Arrived at Floor
llMessageLinked(LINK_ALL_CHILDREN, 0, "DEBLOQUE_PORTES", NULL_KEY);
llWhisper(0, "Arrived at floor #" + (string)(targetFloor+1));
llPlaySound("ElevatorNoises", 1);
llSetTimerEvent(0);

Je n’ai pas vraiment pu essayer tout ça, mais on ne doit pas être très loin du résultat. D’autre part tu ne m’as pas transmis le code des boutons de commandes qui vont avec, ce qui ne facilite pas les essais. Il y aurait des choses à dire au niveau du code du script elevator mais s’il fonctionne pas la peine d’y toucher.
ah ben merci beaucoup pour ton travail, c'est vraiment extra de ta part. je vai tester ça au plus vitte, et je t'enverrai le script de bouton IG ou ici, comme tu veut. je te tien au courant, merci encore
Répondre

Connectés sur ce fil

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