• 19 Avril 2025, 11:49:59


Auteur Sujet: Problème trigonométrique !  (Lu 1958 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne CarCrasher

  • *
  • Tueur en série
  • Messages: 144
    • Voir le profil
Problème trigonométrique !
« le: 02 Mai 2014, 10:51:25 »
Bonjour bonjour !

Aujourd'hui me revoilà avec un nouveau problème plus mathématique que de script !

Donc dans mon script, j'ai un script de vêtements, dont certains sont rares à avoir, mais bon ça on s'en fout !
Donc certains équipements ont une caractéristique spéciale, par exemple la dynamite que l'on peut porter sur le dos provoque une explosion si le joueur meurt !

Mais donc, ici je crée un équipement les yeux laser ! Comme le nom l'indique, il s'agit de pourvoir les yeux du joueur de lasers !
Néanmoins, je voudrais que ces lasers créent des flammes lorsque le joueur appuie sur une telle touche, à l'endroit où les lasers touchent le sol, actuellement, je voudrais que ces explosions ne puissent se faire que lorsque le joueur est immobile, problème réglé en 5 minutes à l'air de GetPlayerVelocity.

Mais le moment où ça coince, c'est le calcul de l'endroit où les lasers touchent le sol !

Donc je me rends compte que le pawno est un peu limité pour ce genre de choses, je me contente de créer une explosion légèrement plus approximative.

Donc ici, j'ai pris des coordonnées, de façon à voir à peu près le truc...

Lorsqu'on est face au nord, càd avec le Facing Angle = 0; L'explosion devrait se produire :
- À 1.6 unités en moins à l’abscisse (xExplosion = xJoueur-1.6)
- À 11 unités en plus à l'ordonnée (yExplosion = yJoueur+11)

Donc en fait le problème réside surtout dans le fait que la divergence sur l'abscisse n'est pas isométrique à celle sur l'ordonnée, donc ça fait pas un cercle, mais plutôt une sorte d'ovale trigonométrique ! :happy:

Code: (pawn) [Sélectionner]
new Float:x, Float:y, Float:z, Float:angle;
GetPlayerPos(playerid,x,y,z);
GetPlayerFacingAngle(playerid, angle);
x += (-1.6 * floatsin(-angle, degrees));
y += (11 * floatcos(-angle, degrees));
CreateExplosion(x, y, z, 1, 7.0);

Je sais absolutiment pas comment le modifier de façon à ce que ça fonctionne, là en fait, le code fonctionne lorsque le joueur est face au nord ou au sud, mais lorsque c'est vers l'est ou l'ouest, l'explosion se produit à l'inverse de loin et un peu décallé, c'est à dire tout près :(

Enfin merci mes choupinous ! :kiss:
« Modifié: 24 Mai 2014, 08:51:25 par Gzsume »

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Problème trigonométrique !
« Réponse #1 le: 02 Mai 2014, 15:36:28 »
Salut,

j'aime bien l'idée c,est vraiment original et ça peut donner un bon résultat.
Ton approche est bonne, mais il y a un petit détail.

Avec ton 1.6 et 11.0 tu dois déterminer la norme de ton vecteur.
Il s'agit donc d'utiliser un pythagore pour déterminer la distance en diagonale.
Dans ton cas la valeur est de 11,1.

Il s'agit donc de la valeur avec laquelle tu dois multiplié tes sin et cos.
Puisque tu as un décalage à ton 0° (les valeurs que tu donne implique un certain angle), il est possible que tu doivent ajouter ce décalage à ton angle. Avec une arctangente tu peut déterminer l'angle en question (on parle d'un angle de 8.3° environ).

Normalement, tu devrais donc faire un truc dans ce genre là:

GetPlayerPos(playerid,x,y,z);
GetPlayerFacingAngle(playerid, angle);
angle += 8.3; // on ajoute notre offset de 8.3° environ sens anti-horaire
x -= (11 * floatsin(angle, degrees)); // inversé à cause de l'orientation des angles dans gta...
y += (11 * floatcos(angle, degrees));

Bonne chance

++Sim++





Hors ligne CarCrasher

  • *
  • Tueur en série
  • Messages: 144
    • Voir le profil
Re : Problème trigonométrique !
« Réponse #2 le: 02 Mai 2014, 16:37:11 »
Ah merci, j'y aurais jamais pensé à l'angle de déviation, j'étais encore en train de rechercher un coefficient de modification de la distance :biggrin:
Mais pour les angles en fait, je les avais déjà inversé

Enfin merci !