Dans le script de Ahuri, on peut remplacer
llDetectedTouchUV( 0 ) par
llDetectedTouchST( 0 ) si on veut connaitre la position sur la surface touchée je crois.
llDetectedTouchUV est pour la position sur la texture.
llDetectedTouchST est la position sur la surface de la primitive directement
Je fonctionne plutôt comme ça.
J'ai fais un "petit" script "très simple" qui permet de désigner un rectangle sur une surface d'un prim. Ensuite tu peux demander à voir le code a insérer dans touch_start() { }
Problème : je n'ai pas le temps de tester le code.
Donc il ya peut etre des bugs.
Je verrais dés que possible, mais peut tu tester juju. Et me dire ce que j'ai mal expliqué.
// Script gratuit. Ne peut être vendu.
// Edité par Nexus763 Beaumont
integer noSelect = 0;
integer mainCan;
string mainMess = "\n Voulez vous sélectionner une zone cliquable ?\n1.Désigner un rectangle sur une surface\n2.Montrer juste un point de la surface";
string b1 = "1.Rectangle";
string b2 = "2.Pointer";
list mainMenu = [b1,b2];
integer faceSelect = -1;
list coins; //contient les quatre position coins du rectangle
vector initColor; // couleur sauvegardée pour faire une blink
list cornerMenu;
default
{
on_rez(integer start_param)
{
llResetScript();
}
state_entry()
{
mainCan = -llFloor(llFrand(1000000)+1);
llListen(mainCan,"",llGetOwner(),"");
llOwnerSay("Script de repérage des zones cliquables");
}
touch_start(integer total_number)
{
if(noSelect == 0) //on affiche le menu
llDialog(llGetOwner(),mainMess,mainMenu,mainCan);
else {
if(noSelect == 1) // rectangle
{
if(faceSelect == -1) {
coins = [];
faceSelect = llDetectedTouchFace(0);
initColor = llGetColor(faceSelect);
llSetTimerEvent(0.5);
}
if(faceSelect != llDetectedTouchFace(0) || llDetectedTouchST(0) == TOUCH_INVALID_TEXCOORD) // je ne sai pas si cela importe, je testerais si j'ai le temps
llOwnerSay("Impossible de déterminer la position touchée ! Mauvaise face ?");
else
{
coins += [llDetectedTouchST(0)];
llOwnerSay("Attendez une petite seconde avant de recliquer quelque part");
if(llGetListLength(coins) >= 4)
{
llSetTimerEvent(0.0);
noSelect = 0;
llSetColor(initColor,faceSelect);
llOwnerSay("Rectangle enregistré.");
mainMenu += ["RECORD"];
mainMess += "\nRECORD : code pour détecter le touch dans le rectangle enregistré";
llDialog(llGetOwner(),mainMess,mainMenu+["RECORD"],mainCan);
}
}
}
else if(noSelect == 2) //point tout seul
{
llOwnerSay(llGetObjectDesc()+" touché sur la face "+(string)llDetectedTouchFace(0)+" aux coordonnées "+(string)llDetectedTouchST(0));
}
}
}
listen(integer channel, string name, key id, string message)
{
if(channel == mainCan)
{
if(message == b1) // rectangle
{
noSelect = 1;
llOwnerSay("Vous pouvez cliquer sur la surface voulue : choisissez deux coins opposés de votre rectangle (en bas à gauche, puis en haut à droite par exemple).");
}
else if(message == b2) //point
{
noSelect = 2;
llOwnerSay("Touchez un point d'une face pour savoir ses coordonnées");
}
else if(message == "RECORD") // montrer rectangle enregistrer
{
vector pos1 = llList2Vector(coins,0);
vector pos2 = llList2Vector(coins,1);
float XC1 = pos1.x;
float YC1 = pos1.y;
float XC2 = pos2.x;
float YC2 = pos2.y;
if(XC1 > XC2) {
float intermed = XC1;
XC1 = XC2;
XC2 = intermed;
}
if(YC1 > YC2) {
float intermed = YC1;
YC1 = YC2;
YC2 = intermed;
}
//llOwnerSay("=======Coins enregistrés========\n - "+llDumpList2String(coins,"\n - "));
llOwnerSay(" ====Voici le code à insérer dans l'évenement touch_start()====
vector st = llDetectedTouchST(0);
float X = st.x;
float Y = st.y;
if(X > "+(string)XC1+" && X < "+(string)XC2+" && Y > "+(string)YC1+" && Y < "+(string)YC2+") //si le clic est compris dans le rectangle
{
//actions à faire
}
";)
}
}
}
timer()
{
if(llGetColor(faceSelect) == <1.0,1.0,1.0>)
llSetColor(<0.3,0.0,0.0>,faceSelect);
else
llSetColor(<1.0,1.0,1.0>,faceSelect);
}
}