• 04 Juin 2026, 08:06:09


Auteur Sujet: compteur vitesse.  (Lu 9719 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne sadmandono

  • *
  • Nouveau
  • Messages: 13
    • Voir le profil
compteur vitesse.
« le: 30 Juillet 2007, 23:17:46 »
Bonjour à tous.
Voila. Je voudrais créer un compteur de vitesse pour mon serveur. Or, je déteste faire des copier-coller.
J’ai donc décidé d’écrire mon propre script. (Bien que je débute en prog.).
Je veux simplement que vous me disiez, si j’emploie la bonne méthode. Et sinon, que vous m’indiquiez une meilleure méthode. Mais surtout pas un script complet, juste une méthode. J’insiste là-dessus, car comme je l’ai dit plus haut, je déteste faire des copier-coller car c’est trop facile.
Voila, j’espère que vous pourrais me conseiller.
Note aux Admins. Si vous juger, ce topic inutile, n’hésitez pas à le supprimer. (Même si vous n’avez pas besoin de mon autorisation ^^).

Voici l’adresse Pastebin. http://pastebin.gtaonline.fr/pastebin.php?show=28   


GuiGui

  • Invité
Re : compteur vitesse.
« Réponse #1 le: 31 Juillet 2007, 00:53:35 »
Salut sadmandono

Je suis comme toi un débutant en programmation et comme toi je deteste faire du copier/coller  ;)

J'ai regardé ton code, je t'avouerai franchement que j'y comprend pas grand chose. Moi je serais partis autrement, j'aurais peut-être utilisé la bonne vieille formule V = D/T où V = vitesse, D = Distance et T = Temps, avec un timer. Encore faut il trouvé la bonne unité pour D.

Attendons la réponse de notre expert Syg  ::)

Ps: Je ne vois pas pourquoi on supprimerai ton topic  :)

Hors ligne UZI-I

  • BinaryIPL Manager
  • *
  • Grand Banditisme
  • http://www.yoa2n.fr
  • Messages: 825
    • Voir le profil
    • Yoa2n.fr
Re : compteur vitesse.
« Réponse #2 le: 31 Juillet 2007, 01:15:57 »
Moi j'aurai utiliser la fontion kph() (ou un truc comme ça) des include non-officiel SA-MP.

Comme vous voulez :)

Hors ligne At1x

  • *
  • Criminel
  • Messages: 28
    • Voir le profil
Re : compteur vitesse.
« Réponse #3 le: 31 Juillet 2007, 08:07:46 »
Euh dis moi pourquoi tu utilises pas les fonctions floatpower, floatsqroot ... au lieu de faire Deplacement1*Deplacement1  dans le genre ? Sinon moi perso j'ai déja essayé de faire un compteur tout seul mais sa me retournais un chiffre comme 354354687 alors que mon joueur ne bougait pas d'un poil :s

Hors ligne sadmandono

  • *
  • Nouveau
  • Messages: 13
    • Voir le profil
Re : compteur vitesse.
« Réponse #4 le: 31 Juillet 2007, 15:26:41 »
Bonjour.
Guigui. C’est bel et bien V=D/T que j'ai utilisé pour mon script (incomplet d'ailleurs, puisque je n'ai pas encore intégrer les timer.)
Pour trouver D. j’ai utilisé….Pythagore ! (Je vous laisse deviner pourquoi). Cela vous aidera peut-être à comprendre pourquoi il y a des carrés et racine carrée dans le script.

At1x pourquoi utiliser une fonction pour trouvé un carré. Alors qu’il suffit de multiplier une variable par elle-même ?

J’ai testé mon script avec un ide. Dev c++.
J’ai lancé le mode debug de san andreas. J’ai parcouru la map d’est en ouest chrono en main (sans oublier d’utiliser la commande /save au départ et à l’arrivé). En divisant le résultat par le temps obtenu. Le script m’a retourné des valeurs comme 256 km/h et plus pour un hydra. Et environ 80 km/h avec une voiture de base (ce sont des moyennes sur toute la distance et non pas des vitesses à un temps T).

UZI-I. merci pour l'info mais comme je préfère créer cette fonction compteur de A à Z....
Sinon, si vraiment je ne trouve pas, je jetterais peut-être un coup d'oeil à cette fonction kph() :)

C'est bizarre. Ma signature ne fonctionne pas dans ce topic alors quelle marche très bien. dans mon profil.

« Modifié: 31 Juillet 2007, 16:11:22 par sadmandono »


Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : compteur vitesse.
« Réponse #5 le: 31 Juillet 2007, 23:03:07 »
Première erreur : Tu récupères deux fois de suite la position du joueur (CoordX et CoordX2) l'une à la suite de l'autre.
J'imagine que ces deux appels à la fonction GetPlayerPos se font si rapidement que CoordX et CoordX2 doivent sensiblement être égaux et que donc la vitesse que tu calcules doit être complétement fausse.

Deuxième erreur : Tu calcules la vitesse du joueur dans le plan (XY) et tu oublies que GTA est en 3D et qu'il y a un composante Z. (La vitesse d'un joueur en chute libre sera de 0 KM/H avec tes calculs .... !!!)

Autre chose : floatsqroot pour calculer une racine carrée me semble plus rapide que ton algorithme.

Donc petit cours sur le compteur de vitesse :
Effectivement, comme l'a dit Guigui, il faut se baser sur un timer. Donc on démarre un timer de 1000ms dans OnGameModeInit (1000ms sinon on risque de surcharger le serveur si tous les joueurs mettent le compteur de vitesse). On verra plus loin ce qu'on met dedans.
Ensuite, on met en place notre commande "/vitesse" et là, on ne fait que sauvegarder la position (Xa, Ya, Za) du joueur dans un tableau (une entree par joueur) et positionner un flag (un par joueur) pour dire que le joueur a demandé le compteur de vitesse.

Dans notre Timer :
Si le joueur a demandé le compteur de vitesse (test sur le flag qu'on a positionné dans la commande)
On récupère la position de joueur (Xb, Yb, Zb) (ce qui fait qu'on va récupérer la position de joueur toutes les secondes).
Ensuite, on calcule la distance (en 3D) qu'il a parcouru depuis sa dernière position.
La distance entres un point A(Xa Ya, Za) et B(Xb, Yb, Zb) dans l'espace est :
   Dist = floatsqroot ((Xb-Xa)*(Xb-Xa) + (Yb-Ya)*(Yb-Ya) + (Zb-ZXa)*(Zb-Za))
Dans SA-MP, les coordonnées sont en mètres (enfin je crois) donc la vitesse du joueur est :
Vitesse en m/s -> Vitms = Dist/1.0 (puisque notre timer est à 1 seconde) (cette ligne en inutile dans le script)
Donc Vitesse en KM/H -> VitKmh = Dist / 3600.0 (C'est cette vitesse qu'on affiche)
Enfin, on sauvegarde la nouvelle position du joueur (Xa, Ya, Za) = (Xb, Yb, Zb)

Dernière petite chose : Si le joueur refait /vitesse, on reset le flag comme ça le compteur ne s'affiche plus

Par contre, vu qu'on utilise un timer, la précision n'est pas géniale et à vitesse constante du ton véhicule, le vitesse affichée peut varier de +/- 10 km/h. Pour un peu plus de précision, on peut utiliser la fonction GetTickCount (disponible exclusivement sous Windows) et sauvegarder le TickCount en même temps que la position du joueur et faire les calcul avec la différence entre le TickCount suvegardé et le TickCount du moment où l'on calcule.



++
Syg
Courtesy of GtaManiac

Hors ligne R@f

  • *
  • GTAOnline Addict
  • Messages: 4655
    • Voir le profil
Re : compteur vitesse.
« Réponse #6 le: 01 Août 2007, 13:08:43 »
l expert a parlé .....

 :dejadehors

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : compteur vitesse.
« Réponse #7 le: 01 Août 2007, 23:41:48 »
Merci Raf(FS), c'est trop d'honneur  :-[.

En plus, l'expert a fait une grosse boulette qu'il vient de voir en se relisant (oui, bon d'accord, j'aime me relire mais c'est pour trouver mes erreurs avant que d'autres ne les trouvent)
La vitesse en KM/H est (mais tout le monde s'en était rendu compte) VitKmh = Dist * 3600.0 (hum hum, je l'avais fait exprès pour voir si vous suiviez)

++
Syg
Courtesy of GtaManiac

Hors ligne sadmandono

  • *
  • Nouveau
  • Messages: 13
    • Voir le profil
Re : compteur vitesse.
« Réponse #8 le: 02 Août 2007, 03:34:23 »
Bonjour.

Pour la vitesse en chute libre, j’avais estimé que ce n’étais pas indispensable. Mais en y réfléchissant, j’avais tort.

Je ne connais pas encore parfaitement les flags (j’ai encore à apprendre).
En tout cas la méthode donnée est à 80% égale à ce que j’avais imaginé avant de commencer mon script. Mais je ne savais pas tellement comment m’y prendre. Je ne savais pas où placer mes SetTimer ;D.

Merci pour ce petit cours, c’est exactement ce que je demandais (Une méthode, pas une solution).

Voila, je vais me mettre au boulot. Je reviendrais sur ce topic en cas de problèmes.

Quelqu'un connaît l’id max pour la météo ? 50 100 200 ……. ?

PS : Je me disais bien. : « Mais pourquoi il veut me faire diviser la vitesse pas 3600 ?!!!! ». C’était fait exprès ? (hum hum hum  :blink.)


Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : compteur vitesse.
« Réponse #9 le: 02 Août 2007, 13:27:21 »
Très léger cours sur les flags (drapeaux).
En fait un flag n'est qu'une "vulgaire" variable à qui l'on fait prendre les valeurs 0 ou 1 (parfois d'autres valeurs dans certains cas plutôt rares) pour indiquer un état particulier (d'un joueur, d'un véhicule, ...).

Par exemple si on déclare le tableau suivant :
new CompeurOn[MAX_PLAYERS]; // Un flag par joueur pour le compteur de vitesse

Lorsque le joueur tape la commande "/vitesse" pour la première fois, on fait passer la valeur de son flag à 1 :
CompteurOn[playerid] = 1; // Afficher le compteur pour le joueur

On se sert ensuite de ce flag pour savoir si le joueur a activé le compteur de vitesse :
if (CompteurOn[playerid] == 1)
{
   // On fait ce qu'on a à faire
}


Puis, quand le joueur saisi la commande "/vitesseoff", on reset son flag :
CompteurOn[playerid] = 0; // Plus de compteur pour le joueur

C'est pas très compliqué.

Bon, maintenant, je suis en vacances, retour le 20 août.
EDIT Syg :
Et j'en ai apparement bien besoin parce que, deuxième boulette : C'est pas par 3600.0 qu'il faut multiplier mais par 3.6 (OK, je vais pas dire que je l'avais fait exprès ....En fait dans mon script, je me sers de GetTickCount () qui donne des millisecondes, d'où le 3600.0)
Effectivement, je suis expert, mais expert en boulettes !!



++ les scripteurs
Syg
« Modifié: 02 Août 2007, 15:54:29 par Syg »
Courtesy of GtaManiac

Hors ligne UZI-I

  • BinaryIPL Manager
  • *
  • Grand Banditisme
  • http://www.yoa2n.fr
  • Messages: 825
    • Voir le profil
    • Yoa2n.fr
Re : compteur vitesse.
« Réponse #10 le: 02 Août 2007, 16:39:38 »
Pour quoi tu appelle ça des "flag" ?

C'est des array unidimensionnel.

GuiGui

  • Invité
Re : Re : compteur vitesse.
« Réponse #11 le: 02 Août 2007, 18:29:03 »
Pour quoi tu appelle ça des "flag" ?

C'est des array unidimensionnel.

Peut-être parce que c'est plus court "flag"  ;)

Hors ligne sadmandono

  • *
  • Nouveau
  • Messages: 13
    • Voir le profil
Re : compteur vitesse.
« Réponse #12 le: 02 Août 2007, 22:42:39 »
Coucou. en fait, les "flags" c'est la même chose que les booléens ?  :blink


Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : compteur vitesse.
« Réponse #13 le: 02 Août 2007, 23:10:19 »
Oui Sadmandono, mais dans l'absolu un flag est un indicateur d'état binaire qui prend les valeurs VRAI=1 ou FAUX=0 alors qu'un booléen est un type de donnée (qui n'existe pas en PAWN d'ailleurs).
Ainsi, dans l'absolu toujours, un flag est de type booléen.

Mais dans le langage courant des développeurs (comme moi), on étend parfois la définition du flag aux indicateurs d'états multiples (par exemple, VRAI, FAUX ou INDEFINI ou encore BLEU, VERT, ROUGE, JAUNE ou ORANGE_FLUO_QUI_FLASHE_BIEN) parce que, comme le dit Guigui c'est plus court à dire et à écrire.

Dans le cas qui nous interresse, le flag est bien binaire (AVEC=1 ou SANS=0 affichage du compteur de vitesse).

Et donc pour répondre à UZI-I, sans trop le contredire,
new CompeurOn[MAX_PLAYERS]; // Un flag par joueur pour le compteur de vitesse
est un array (tableau) unidimensionnel de flags (un par joueur comme le dit le commentaire)

++ (la je suis vraiment en vacances maintenant, profitez en pour dire du mal de moi)
Syg
Courtesy of GtaManiac

Hors ligne UZI-I

  • BinaryIPL Manager
  • *
  • Grand Banditisme
  • http://www.yoa2n.fr
  • Messages: 825
    • Voir le profil
    • Yoa2n.fr
Re : compteur vitesse.
« Réponse #14 le: 03 Août 2007, 02:51:55 »
C'est un Array de taille [MAX_PLAYERS]

Apres tu en fait ce que tu veut.