Si j'ai bien compris, tu veux faire tourner le hud dans son ensemble, quand on appuie sur un bouton. Mais tu ne veux pas que le bouton qui déclenche la rotation soit la prim racine.
Contraintes techniques :
- pour faire tourner un ensemble, c'est la prim racine qu'il faut faire tourner
- la fonction llSetLocalRot agit sur la prim qui contient le script
- si le script contenu dans une prim (par exemple la prim numero 5) doit faire tourner une autre prim (par exemple la numéro 1, c'est à dire la prim racine), il faut utiliser llSetLinkPrimitiveParamsFast(num,
[liste de parametres]). Le paramètre num permet alors de spécifier sur quelle prim on veut agir.
Au niveau de la sélection de l'action à accomplir :
- solution 1 :
l'ensemble (le hud) comporte plusieurs boutons, contenant un script avec un événement touch_start, c'est le script de la prim touchée qui reçoit l'événement.
Dans ce cas, chacun des scripts contient les instructions à accomplir quand on touche le bouton correspondant.
Je suppose que c'est ce que tu fais.
Dans ce cas là, pour faire tourner la racine (prim numéro 1), avec un script situé par exemple dans la prim numéro 5, il faut utiliser :
touch_start(integer start_param)
{
llSetLinkPrimitiveParamsFast(1, [PRIM_ROT_LOCAL, llGetLocalRot()*rot_xyzq] );
}
- solution 2
Tu utilises un script unique pour tout le hud, que tu places dans la prim racine.
Dans ce cas, quelle que soit la prim touchée, le script reçoit l'information.
Pour choisir ce qu'il faut faire, il suffit de détecter le numéro de la prim touchée par
comme le fait MentalOh dans le script qu'il a donné plus haut.
@MentalOh
Il y a plusieurs petits problèmes dans ton script. Entre autres :
- pour effectuer la rotation, tu vérifies si la prim touchée est la prim numéro 1 (c'est à dire la racine). Or, on veut justement déclencher en touchant une autre prim que la racine. Il faudrait donc remplacer la valeur "1" par celle du bouton.
- tu utilises llSetLocalRot , ce qui suppose que le script est dans la racine. Or, si Nyxia utilise effectivement d'autres scripts avec un touch_start dans les prims bouton, la seule solution pour déclencher le touch_start de ton script, est de cliquer sur la prim racine, qu'on veut éviter.
Ce que je te conseillerais, c'est d'opter pour la solution 2, un script unique dans la racine, plutôt que de trimballer un hud avec autant de scripts que de boutons.
Ca ressemblerait à ça :
tourner()
{
vector xyz_angles = <0,0,180>; // This is to define a 1 degree change
vector angles_in_radians = xyz_angles*DEG_TO_RAD; // Change to Radians
rotation rot_xyzq = llEuler2Rot(angles_in_radians); // Change to a Rotation
llSetLinkPrimitiveParamsFast(1, [PRIM_ROT_LOCAL, llGetLocalRot()*rot_xyzq] );
}
default
{
touch_start(integer n)
{
integer linknum = llDetectedLinkNumber(0); // numero de la prim touchee
if (linknum == 2)
tourner();
else if (linknum == 3)
{
//effectuer les actions associees au bouton numero 3
}
else if (linknum == 4)
{
//effectuer les actions associees au bouton numero 4
}
}
}
Après, il y a aussi la solution, à mon sens plus élégante, qui consiste à faire un hud avec une seule primitive, et une texture adéquate (les boutons étant dessinés sur la texture) et à détecter non pas le numéro de la prim touchée, mais à quel endroit on a touché le hud. Mais on s'éloigne du sujet.