[Aide] commander une fonction par un clic sur un endroit precis d'une texture ....

Répondre
Partager Rechercher
bonjour - svp ..... peut-on m'expliquer SVP (me développer) les fonctions "IIDetectedToucFace et IIDetectedTouchST" fonctions qui permettent je crois de pouvoir initier une fonction en cliquant sur un endroit précis d'un objet , en l'occurrence sur cet endroit matérialisé sur une texture ..... est-ce un script ? si oui un exemple serait le bienvenu..... merci à vous . suis novice en scripts .....mais curieuse.
J'avais demandé ça un jour j'ai eu aucune réponses par exemple au lieux de 2 bouton pour un vendor on peut en avoir 1
Voilà un exemple dont je me sers dans mes cours :

Il s'agit de l'évènement déclenché quand on touche l'objet. Ensuite on récupère les coordonnées de l'endroit du clic et on les stock dans X et Y. Ensuite ca se complique on repère juste où le clic à été fait en comparant les valeurs des coordonnées entre elles. Ici on définit 4 zones distinctes : gauche, haut, droite et bas. Ce sont les zones obtenues en découpant selon les diagonales un carré.

Precision : On utilise les coordonnées liées à la texture donc gare aux offsets / répétitions, pour palier ce pb il faut utiliser d'autres coordonnées.

Code PHP:

    touch_start(integer total_number)
    {
        
vector uv llDetectedTouchUV(0);
        
float X uv.x;
        
float Y uv.y;
        if( 
)
        {
            
// droite
            
if( (X) < )
            {
 
            }
            
// bas
            
else
            {
 
            }
        }
        else
        {
            
// haut
            
if( (X) < )
            {
 
            }
            
// gauche
            
else
            {
 
            }
        }
    } 
bonjour ... quel script ......?? suite 3
stp Ahuri - je n'ai pas réussi à faire fonctionner le script -
j'ai relevé une position en insérant un tout petit objet à un "panneau" relevé de la position de ce petit objet pour "cibler" l'endroit du clic (est-ce de cette position qu'il s'agit ?)- mais où dois-je noter cette position x-y- ds le script que tu as mis plus haut à notre disposition ?
merci .
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é.

Code:
// 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);
		}
}
Citation :
Publié par majuju
stp Ahuri - je n'ai pas réussi à faire fonctionner le script -
j'ai relevé une position en insérant un tout petit objet à un "panneau" relevé de la position de ce petit objet pour "cibler" l'endroit du clic (est-ce de cette position qu'il s'agit ?)- mais où dois-je noter cette position x-y- ds le script que tu as mis plus haut à notre disposition ?
merci .
Tu prends ton panneau, tu clics dessus. Les coordonnées X et Y de mon script sont comprises entre 0 et 1. Elle correspondent à la position sur la texture de ton clic. J'avais implémenté cela pour un système qui nécessitait cette option.

Toi visiblement tu n'as pas besoin d'être relatif à la texture mais plutot à la face elle meme (en terme de dimensions). Il te faut donc comme je l'avais indiqué utiliser la fonction llDetectedtouchST. Cette fonction te donne les coordonnées réelles de ton clic sur la face.

Mets la fonction llOwnerSay((string)llDetectedTouchST(0)); dans un touch_start pour observer les valeurs que prennent les coordoinnées.

Ensuite adapte mon script ou celui de Nexus à tes besoins en utilisant les coordonnées (X,Y) du clic.
suite.......
merci pour vos réponses et votre aide .....mais je n'ai encore abouti à rien - suis encore trop nulle en script....je me pencherai sur ce truc quand j'aurai mieux assimilé comment tout cela fonctionne . Je vais me cantonnée à ce que je connais pour le moment....Nexus stp ? j'ai une erreur de syntaxe quand j'essaie ton script à la ligne:
//actions à faire
}
"
hors de mes compétences pour le faire fonctionner -
merci pour votre aide . Je pars dans 3 jours , je verrai cela à mon retour. bisous a vous
Répondre

Connectés sur ce fil

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