GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: nds84 le 22 Octobre 2008, 13:51:54
-
Bonjour,
Je voudrais faire une rotation d'un object comme sa :
Comment faire ?
Merci
-
Je pense que ce n'est pas possible.
++
nikko
-
Si j'ai vu sur un serveur sa. c'était le mien Xd.Enfin bref et je crois que je ne l'ai plus se systeme si je le trouve je vous le dit mais attention sa bug defois donc ses chaud a faire.
EDIT voila de l'aide.
SetObjectRot(pdgateSF2, 0.0000, 90.0000, 270.0000);
tu renomme le pdgate a ton create object et voila.
-
merci :) je test
-
ah ben je savais pas tien :)
++
nikko
-
Pour moi sa ne marche pas
-
Moi aussi je l'ai ...
Mais le souci es que sa ne fait pas sa , moi sa monte doucement :)
et sa se bloque en haut puis sa redescend doucement :)
C'est joli :lock
-
C'est avec un moveobject c'est pour ça ^^ La ton rotate ne sert a rien, utilise les MoveObject ;) Tu as ta position initiale (barrière en bas) tu créé un autre objet en position haut, tu sauvegarde, et tu prend les positions des deux objet, initiale et haut, et après tu met dans un MoveObject.
-
Sa ne marchera pas avec un MoveObject car le move objet ne prend pas encore la rotation il ne prend en compte que les coordoné X,Y et Z , pour faire une simulation de rotation il faut paser par un timer qui augmenter la rotation de l'objet tout les 500ms par exemple
-
Oui ses vrai j'est essayer avec un moveobject sa fesait nymp
-
je n'arrive toujours pas a faire la rotation, aidez moi svp
-
Bah ses plus compliquer qu'on le croit la rotation.
PS : je regarderai au soir la je doit aller en cour.
++
-
Sa ne marchera pas avec un MoveObject car le move objet ne prend pas encore la rotation il ne prend en compte que les coordoné X,Y et Z , pour faire une simulation de rotation il faut paser par un timer qui augmenter la rotation de l'objet tout les 500ms par exemple
Oui, c'est la seule solution par contre, le timer de 500 ms est peu long, je dirais plutôt 50 ms.
500 ms -> 2 images par secondes (donc des saccades)
50 ms -> 20 images par secondes (pas super top mais beaucoup plus fluide quand même, par contre, gourmand en ressource)
Pour faire ça, on commence par faire comme [StAfF]mAn à dit pour déterminer les positions de départ et d'arrivée.
On se retrouve donc 2 sextuplets : (Xd, Yd, Zd, Axd, Ayd, Azd) et (Xa, Ya, Za, Axa, Aya, Aza).
X, Y, Z sont les coordonées de l'objet (d=départ, a=arrivée)
Ax, Ay, Az sont les angles selon les axes X, Y et Z (d=départ, a=arrivée).
Si l'on veut que notre barrière s'ouvre (on se ferme) en 3 secondes avec un timer de 50 ms, il faudra 3*20 images=60 images=60 pas.
Pour chaque couple (Xd, Xa), (Yd, Ya), ... (Azd, Aza) on calcul la valeur de chaque pas :
PasX = (Xa-Xd)/60
PasY = (Ya-Yd)/60
...
PasAz = (Aza-Azd)/60
Nb : Ces valeurs peuvent être négatives
Ensuite, on lance notre timer 60 fois et à chaque fois on incrémente les données de la valeur du pas correspondant :
X = Xd + PasX * IndexDuPas
Y = Yd + PasY * IndexDuPas
..
Az = Aza + PasAz * IndexDuPas
Et on affiche l'objet en (X, Y, Z, Ax, Ay, Az)
Tout ceci fait beaucoup de données mais on peut en pré-calculer la plupart sur le papier et les mettre en dur dans le script.
Je vous laisse mettre tout ça en place.
++
Syg
-
le maitre a parlé :laugh
-
Cest hard a faire quand meme ...
++
nikko
-
perso je me lancerai pas ladedans moi ^^
-
perso je me lancerai pas ladedans moi ^^
S'il en est capable ....
++
nikko
-
Oui, c'est la seule solution par contre, le timer de 500 ms est peu long, je dirais plutôt 50 ms.
500 ms -> 2 images par secondes (donc des saccades)
50 ms -> 20 images par secondes (pas super top mais beaucoup plus fluide quand même, par contre, gourmand en ressource)
Pour faire ça, on commence par faire comme [StAfF]mAn à dit pour déterminer les positions de départ et d'arrivée.
On se retrouve donc 2 sextuplets : (Xd, Yd, Zd, Axd, Ayd, Azd) et (Xa, Ya, Za, Axa, Aya, Aza).
X, Y, Z sont les coordonées de l'objet (d=départ, a=arrivée)
Ax, Ay, Az sont les angles selon les axes X, Y et Z (d=départ, a=arrivée).
Si l'on veut que notre barrière s'ouvre (on se ferme) en 3 secondes avec un timer de 50 ms, il faudra 3*20 images=60 images=60 pas.
Pour chaque couple (Xd, Xa), (Yd, Ya), ... (Azd, Aza) on calcul la valeur de chaque pas :
PasX = (Xa-Xd)/60
PasY = (Ya-Yd)/60
...
PasAz = (Aza-Azd)/60
Nb : Ces valeurs peuvent être négatives
Ensuite, on lance notre timer 60 fois et à chaque fois on incrémente les données de la valeur du pas correspondant :
X = Xd + PasX * IndexDuPas
Y = Yd + PasY * IndexDuPas
..
Az = Aza + PasAz * IndexDuPas
Et on affiche l'objet en (X, Y, Z, Ax, Ay, Az)
Tout ceci fait beaucoup de données mais on peut en pré-calculer la plupart sur le papier et les mettre en dur dans le script.
Je vous laisse mettre tout ça en place.
++
Syg
:blink
Franchement Syg tu as réponse a tout .
Je me met a genou devant toi "Ohh grand Syg " :angelnot
:lmao
:dejadehors
-
Encore un lecon de syg mais moi mon systeme est plus simple et marche.
MAsi j'avoue que c'est long desoler j'ai pas trop le temps.
-
Encore un lecon de syg mais moi mon systeme est plus simple et marche.
MAsi j'avoue que c'est long desoler j'ai pas trop le temps.
Et c'est exactement ce qu'il faut chercher à faire.
Je ne donnais là qu'une solution générique qui marche dans tous les cas.
Dans le cas d'une rotation simple (X, Y, Z constants donc avec PasX, PasY et PasZ = 0) et sur un seul axe (Ax at Ay constants donc PasAx et PasAy = 0), les calculs deviennent vite très simples aussi.
Et c'est encore plus simple dans le cas d'une translation (déplacement rectiligne) car la fonction MoveObject fait tout pour nous.
Voici un très petit exemple de ce qu'on peu faire avec la méthode dont a parlé mister-fred et quelques notions sur les courbes paramétrées :
/* Le tonneau qui tourne */
new Barrel;
forward BarrelTurn ();
new Float:Ax=0.0, Float:Ay=0.0, Float:Az=0.0;
new Float:BX=0.0, Float:BY=0.0, Float:BZ=0.0;
new Float:T;
public OnGameModeInit ()
{
/* Le tonneau qui tourne au dessus du skate park à Los Santos */
Barrel = CreateObject (1225, 1912.0, -1390.0, 15.5, 0.000000, 0.000000, 0.000000);
/* On demarre un timer pour le tonneau qui tourne */
SetTimer ("BarrelTurn", 20, true);
}
/* Fonction de timer pour faire tourner le tonneau */*
public BarrelTurn ()
{
/* Les angles */
Ax += 1.0;
Ay += 1.5;
Az += 2.0;
/* On repasse par l'origine */
if (Ax == 360.0) Ax = 0.0;
if (Ay == 360.0) Ay = 0.0;
if (Az == 360.0) Az = 0.0;
SetObjectRot (Barrel, Ax, Ay, Az);
/* La position de l'objet */
T += 2.0;
if (T > 360.0) T=T-360.0;
BX = 1912.0 + 2.0 * floatcos (2.0*T, degrees);
BY = -1390.0 + 2.0 * floatsin (3.0*T, degrees);
BZ = 15.5;
SetObjectPos (Barrel, BX, BY, BZ);
}
Le jeu consiste à toucher le tonneau avec une moto (c'est possible et si on réussi, on le sait tout de suite .... BOUM !!).
++
Syg