GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: vincentdu90 le 29 Novembre 2008, 14:56:18
-
Bonjour a tous,
Je voudrais savoir comment on fais pour faire un compteur car je voudrais l'utiliser pour un truc que je voudrais faire .
Juste un compteur simple avec Km (et essence).
Je voudrais aussi savoir quand un joueur prend un pickup sa lui donne de l'essence ou des armes ect...
Merci d'avance.
-
Salut pour le compteur tu as le compteur a raf
http://www.gtaonline.fr/forums/index.php/topic,1832.0.html (http://www.gtaonline.fr/forums/index.php/topic,1832.0.html)
-
Oui je sais mais voila je l'ai dit moi je veut pas le nom est tout et moi je veut faire un truc different donc faut que je comprenne le fonctionnement .
Donc ça serait sympa de m'aider .
-
Un petit up !! (je sais pas si c'est autoriser)
-
sur le forum samp il y en a un tout simple juste les mph et le fuel ;) tu t'en inspire et tu le modifie pour toi
PS: si je le retrouve je te donne le lien
EDIT: http://forum.sa-mp.com/index.php?topic=77552.0 (http://forum.sa-mp.com/index.php?topic=77552.0) <====speedo KM/h
-
Salut,
le script de r@f n,est pas si compliqué, avec un peu d'effort, on comprend que cette ligne:
distance = floatsqroot(floatpower(floatabs(floatsub(x,SavePlayerPos[i][LastX])),2)+floatpower(floatabs(floatsub(y,SavePlayerPos[i][LastY])),2)+floatpower(floatabs(floatsub(z,SavePlayerPos[i][LastZ])),2));
sert à savoir la distance parcourue pas le joueur depuis 1 seconde (dans ce cas),
ensuite on fait les bon calculs afin de convertir ce nombre (une distance divisé par un temps = une vitesse) en km/h ou mph..
le nom du véhicule, c'est un peu facultatif mais bon, c'est juste le VehiclesName[VModel-400], VehiclesName étant l'array qui est placé en haut du script...
puis l'altitude, c'est toit qui voit, tu supprime ou tu el remplace tout simplement par la valeur de l'essence de ton script d'essence
en espérant que tu comprenne quelque chose à ça...
++Sim++
-
Mais que je comprenne bien la vitesse c'est les nouvelles coordonnées X,Y,Z - les anciennes
EDIT:Tu pourrait m'expliquer un peu plus en details le codes ça serait gentil . :-[
-
Up !
S'il vous plaît vous pouvez m'aider .Je suis désolé
-
Salut,
pour la vitesse, le script ne fait que prendre la position précédente du joueur (SavePlayerPos[playerid][LastPos....];) et sa nouvelle position (GetPlayerPos(playerid,x,y,z);)
puis il calcule la distance entre les deux positions, (en usant de la même technique que pour la norme d'un vecteur dans les réel^3, semblable au théorème de pythagore avec les triangle rectanlges, mais avec trois données...)
par la suite il multiplie cette donnée par une certaine valeur (d'ailleurs je comprend pas pourquoi faire deux calculs, alors qu'on pourrait convertir directement, et les distances sont-elles en mètres ou en pieds??)
bref par la distance parcourue en une seconde, on extrapole pour une heure et on met en kilomètres ou en milles...
++Sim++
-
Ok merci je comprend un peu mieux , mais c'est quoi floatpower , floatabs, floatsub ?
Des variables qui conntiennent la coordonnées x,y,z ?
-
Salut,
floatpower: la variable au carré, tu pourrais juste la multiplier par elle même également...
floatabs: la valeur absolue de la variable (si la variable est négative, elle devient positive, sinon elle ne change pas)
floatsub: soustraction de deux float et plus....
edit:
tant qu'à y être...
floatsqroot: la racine carré du float en question
++Sim++
-
Donc
distance = floatsqroot(floatpower(floatabs(floatsub(x,SavePlayerPos[i][LastX])),2)+floatpower(floatabs(floatsub(y,SavePlayerPos[i][LastY])),2)+floatpower(floatabs(floatsub(z,SavePlayerPos[i][LastZ])),2));
Sa voudrais dire qu'on la racine au carrée de ça
(floatpower(floatabs(floatsub(x,SavePlayerPos[i][LastX])),2)+floatpower(floatabs(floatsub(y,SavePlayerPos[i][LastY])),2)+floatpower(floatabs(floatsub(z,SavePlayerPos[i][LastZ])),2));
Et la dedans on fait a chaque fois dans ce bout de code on fait pour chaque coodonnées la variable au carré de la valeur absolue c'est a dire x y ou z puis on soustrait .?
-
Salut,
en réalité, la soustraction sert à savoir la variation dans l'un des sens (par exemple en x),
ensuite, comme dans la formule de pythagore, A²+B² = C², que l'on peut facilement modifier pour avoir C = racinecarrée(A²+B²) et qui est toujours valide en 3 dimensions.. c = racinecarrée(A²+B²+C²)
donc, floatsqroot(A²+B²+C²) qui devient floatsqroot(floatpower(A)+floatpower(B)+floatpower(C))
maintenant, A, B,C correspondant à la variation en X, Y et Z, sachant que la variation (positive où négative, c'est sans importance puisque que ce nombre sera au carré) on peut en arrivé à la ligne suivante:
floatsqroot(floatpower(floatsub(x,SavePlayerPos[i][LastX]))+floatpower(floatsub(y,SavePlayerPos[i][LastY]))+floatpower(floatsub(z,SavePlayerPos[i][LastZ])))ou encore:
floatsqroot(floatpower(x-SavePlayerPos[i][LastX])+floatpower(y-SavePlayerPos[i][LastY])+floatpower(z-SavePlayerPos[i][LastZ]))
++Sim++
-
Ok bon je vais prendre le deuxieme modele plus facile .
Et ensuite on le divise ?
-
Salut,
ensuite, on convertis, mais l'ennui, c'est que je ne sais pas si les mesures des positions sont données en mètres (ce qui voudrais dire que la carte fait environ 5000m de large...) ou en pied, je vais regarder ce qui est le plus vraisemblable avec mon fast-move et je revien, mais comme là je suis en cours....ca va attendre à ce soir, donc demain matin pour toi.
si les mesures sont en mètres, il faut divisé par 1000 pour convertir en kilomètres, puis vu que la distance est parcourue en une seconde, il faut multiplié par 3600, qui est le nombre de secondes contunes adns une heure... mais comme le speedo de r@f ne correspond pas du tout à cela... je ne sais pas trop...
EDIT: je vien de regarder le script de r@f multiplie par 5000 (pourquoi???) puis, pour en km/h, il divise par 1000, en gros, je crois qu'il ne s'agit que d'une imprécision
bref, il te faudrait multiplier par 3600 puis divisé par 1000, pour en km/h, ce que tu peut simplifer en une simple multiplication par 3,6
++Sim++
-
Merci a toi Sim je crois que j'ai a peu près tout compris avec ta deuxieme solution de code enfaite distance racine au carré de ((ancien X - new x)+(ancien y - new y) + (ancien z + new z))²
-
salut,
heureux de t'avoir aidé :D :D
en plus ça ma fait passer le temps durant mon cours d'informatique, je travail même sur un diapo d'aide sur le lancement d'un serveur sa-mp....
++Sim++
-
Quoi ce que j'ai ecrit est juste .
-
Non Vincent, tu as fait un erreur, il y a des carrés et des soustractions partout :
distance = racine au carré de ((ancien X - new x)²+(ancien y - new y)² + (ancien z - new z)²)
Pour ce qui est de Sims, l'unité utilisé par SAMP semble être le mètre (en tout cas c'est l'unité que j'utilise pour le compteur de vitesse du Lalu's Stunt qui est dérivé de celui de R@F). Et j'ai fait la même correction que celle dont tu parles, j'ai multiplié par 3600 et non pas par 5000.
Sinon, très bon cours de math sur la norme d'un vecteur dans un espace à 3 dimensions (il semble que j'ai enfin trouvé quelqu'un pour me remplacer).
NB : La carte fait 6000 m de large et 6000 m de long (coordonnée de -3000 à 3000) mais on peut aller plus loin en mer
++
Syg
-
Salut,
j'avais pas vu les carrés manquants...( ??? )
Pour ce qui est de Sims, l'unité utilisé par SAMP semble être le mètre (en tout cas c'est l'unité que j'utilise pour le compteur de vitesse du Lalu's Stunt qui est dérivé de celui de R@F). Et j'ai fait la même correction que celle dont tu parles, j'ai multiplié par 3600 et non pas par 5000.
Sinon, très bon cours de math sur la norme d'un vecteur dans un espace à 3 dimensions (il semble que j'ai enfin trouvé quelqu'un pour me remplacer).
NB : La carte fait 6000 m de large et 6000 m de long (coordonnée de -3000 à 3000) mais on peut aller plus loin en mer
Merci de l'info :D et je ne suis pas à la hauteur pour te remplacer, pour moi tu sera toujours le "king" de sa-mp sur gtaonline,
c'est d'ailleur pour cette raison que j'ai un peu "copié" ta façon de signer
++Sim++
-
Ok ben j'ai tout compris , mais dans le code il y a un "i" vous pouvez me dire c'est quoi et après j'arrete de vous embetez .^^
-
Salut,
Ok ben j'ai tout compris , mais dans le code il y a un "i" vous pouvez me dire c'est quoi et après j'arrete de vous embetez .^^
c'est que dans la version que j'utilise, au lieu d'un SetTimerEx, je ne lance qu'un seul timer pour tous les joueurs
donc, le i est la variable de la boucle
++Sim++
-
Et le SavePlayerPos ? Il sert a enregistrer la pos du joueur ? Ou c'est la variable qui contient l'ancienne valeur x ?
-
Salut,
je te conseille de regarder correctement le script de r@f, tu y verra, en haut, une énumération comme suit:
enum SavePlayerPosEnum {
Float:LastX,
Float:LastY,
Float:LastZ
}
suivit de très près par :
new SavePlayerPos[maxp][SavePlayerPosEnum];c'est dans cette variable que l'on stock la position précédente du joueur.
moi je te conseillerais d'ajouter des variables avec le timer pour pouvoir l'arrêter par la suite...
comme ceci:
new UpdateSpeedTimer;
public OnGameModeInit()
{
UpdateSpeedTimer = SetTimer("UpdateSpeed",1000,1);
return 1;
}
Public OnGameModeExit()
{
KillTimer(UpdateSpeedTimer);
return 1;
}
P.S. pour mon message, précédant, je tien a m'excuser mais la version sur le forum utilise également une loop, désolé r@f :-\
++Sim++