GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Ssk le 30 Mai 2009, 21:26:58
-
salut all je me fait un script secret bientot dans le showroom mais je n arrive pas a fait un calcule
je veut qu' un objet pointe ( rotation ) sur le joueurs je n' y arrive pas :'( si on peut m aider
La rotation Z ;)
EDIT1:
Je precise bien j' ai l objet:
Float pris au hasard:
x: 1540 , y;-5204, z : 50;
Joueurs
x: 3540 , y;3504, z : 10;
et je veut que l' objet pointe sur le joueur
Sinon juste pour dire que c' est un missile =)
EDIT2:
je veut aussi avoir la diferrence de mettre entre l objet et le joueur mais y a des erreur de calcule je pense
voila le code
if((xx[playerid] - xx2[Cible])-(yy[playerid] - yy2[Cible]) < 0)
{
format(str,128,"Missile à %f Metres de vous",((xx[playerid] - xx2[Cible])-(yy[playerid] - yy2[Cible]))*((xx[playerid] - xx2[Cible])-(yy[playerid] - yy2[Cible]))/100);
}
else
{
format(str,128,"Missile à %f Metres de vous",(xx[playerid] - xx2[Cible])-(yy[playerid] - yy2[Cible]));
}
SendClientMessage(Cible,0x00F600F6,str);
-
Salut,
ton code est un très bon début,
néanmoins les distances se calculent à l'aide d'une racine carrée (qui équivaut à un exposant 0.5), donc on obtient la formule ci-dessous :
distance totale = (((distance X)^2 + (distance Y)^2 + (distance Z)^2)^0.5)
note: le caractère ^ correspond ici à l'exposant de ... en code cet opérateur n'effectue pas la même opération...
pour ton angle tu devras utiliser cette technique, tu as sans doute déjà vu le cercle trigonométrique?
(http://melusine.eu.org/lab/servpng/bjps/datas/banque/trigo/trigo_01.png)
Il te faut donc trouver une technique pour trouver le bon angle avec les fonctions asin, acos et atan, bonne chance :P
Si tu n'y arrive pas, n'hésite pas à poster
++Sim++
-
merci Sim grace toi sur msn et ici j ai reussi pour la distance et ensuite pour la rotation je cherche encore =)
-
Voila ce que j ai compris pour la distance dite moi si c' est bon ( Attention 100 % paint la fleme au photoshop lol)
dite moi si c 'est faux lol
sinon comment calculer la racine carre car sqrt existe pas en pawn contrairement au c -_-"
Sinon voila la fonction que j ai creer
forward Distance(playerid,id,msg);
public Distance(playerid,id,msg)
{
new Float:Pos1[3],Float:Pos2[3],Float:x,Float:y,Float:Pytha,string[32];
GetPlayerPos(playerid,Pos1[0],Pos1[1],Pos1[2]);
GetPlayerPos(id,Pos2[0],Pos2[1],Pos2[2]);
if(Pos1[0] > Pos2[0]){
x = Pos1[0] - Pos2[0];}
else if(Pos1[0] < Pos2[0]){
x = Pos2[0] - Pos1[0];}
if(Pos1[1] > Pos2[1]){
y = Pos1[1] - Pos2[1];}
else if(Pos1[1] < Pos2[1]){
y = Pos2[1] - Pos1[1];}
if(x > y)
{
Pytha = (x*x)-(y*y);
}
else if(x < y)
{
Pytha = ((y*y)-(x*x))/100;
}
floatsqroot(Pytha);
format(string,sizeof(string),"%.f",Pytha);
return SendClientMessage(msg,0x00F600F6,string);
}
Voila =)
Distance(1 personne , 2 personne ,Personne qui recoit le message );
-
Salut,
ta compréhension de Pythagore est bonne, elle s'applique même aux système à trois dimensions...sauf qu'à ce moment on parlerais plutôt de modules de vecteurs
en passant, tu t'assure que chacune des expressions au carrées sont positive, en réalité, qu'elles soient positives ou non, une fois au carrée, le signe disparait, ce bout du code peut être éliminer....
je persiste à dire que la technique la plus efficace pour obtenir une distance est celle ci:
#define GetDistance(%0,%1,%2,%3,%4,%5) (floatround(((%0 - %3) * (%0 - %3)) + ((%1 - %4) * (%1 - %4)) + ((%2 - %5) * (%2 - %5))))
Cette "fonction" s'utilise comme ceci: new Float:Distance = GetDistance(X1, Y1, Z1, X2, Y2, Z2);
EDIT:
PS. Sur ton image tu soustrais les deux valeurs, tu doit les additionner
Si l'on prend ta technique avec Pythagore, tu as par exemple:
A = Distance entre les deux points en X
B = distance entre les deux points en Y
C = distance entre les deux points en Z
Tu commence en calculant la distance dans un seul plan :
A² + B² = D²
donc tu n'as plus que deux distance, celle dans le plan X, Y et celle qui y est perpendiculaire, C
Puisque ces deux distances sont perpendiculaires, on peut y voir un triangle rectangle dont les cathetes sont D et C
On peut donc calculé la distance totale (appelée E ici) à l'aide d'un second Pythagore
D² + C² = E²
après remplacement, on obtient:
A² + B² + C² = E²
(A² + B² + C²) ^0.5 = E
en mots: La distance entre les deux points = racine carrée de (A² + B² + C²)
soit la fonction que j'aie écrite ci-dessus
++Sim++
-
Merci pour cette remarque =)
forward Distance(playerid,id,msg);
public Distance(playerid,id,msg)
{
new Float:Pos1[3],Float:Pos2[3],Float:x,Float:y,Float:Pytha,string[32],Float:z;
GetPlayerPos(playerid,Pos1[0],Pos1[1],Pos1[2]);
GetPlayerPos(id,Pos2[0],Pos2[1],Pos2[2]);
x = Pos1[0] - Pos2[0];
y = Pos1[1] =- Pos2[1];
Pytha = (x*x)-(y*y);
floatsqroot(Pytha);
if(Pos1[2] > Pos2[2]){
z = Pos1[2] =- Pos2[2];}
else{
z = Pos2[2] =- Pos1[2];}
Pytha += z;
format(string,sizeof(string),"%.f",Pytha);
return SendClientMessage(msg,0x00F600F6,string);
}
comme ca c' est bon ??j ai ajoute de la position Z
-
Salut,
tu devrais trouver ta réponse dans ma modification de mon message précédent....
++Sim++
-
Ok merci beaucoup maintenant me reste plus qu' a decrouvrir comment faire pour la rotation
-
J'avait demander pour trouver l'angle entre un point et un autre point d'un cheekpoint ( dont la norme ) tu devrai le trouver en tapant " Angle cheekpoint " truc comme sa
-
Ok merci j' irrais voir la je suis avec mon prof de math qui va essayez de m aider!
[HS] je serais absent pendant peut etre une longue periode Dsl les gars =) [/HS]
EDIT:POwaaa il m' as aider j' ai a peu pres compris je doit utiliser la tangente et apres arctangente il m' as ecris sur une feuille j' essayerais de voir le resultat ce soir =)