Calcul de la vitesse de déplacement de la souris
11 sujets de 1 à 11 (sur un total de 11)
-
Bonjour
J’essai désespérément de créer une routine pour calculer la vitesse de déplacement de la souris, le problème est que j’y arrive pas et vous vous en serez douté lol
Bon, j’essaie de faire un moteur de Shufflepuck, il me manque la vitesse de déplacement et j’ai un nouveau petit moteur de jeux tout prêt 😉
Bref, y’a des idées?
PB rencontrer:
Calage du calcule du temp en fonction des FPS (sa va pas du tout sa car c’est pas le temps réel) donc si l’ordinateur est trop lent, la vitesse sera aussi trop lente
Erreur dans la vitesse: entre le moment du mouvement et de l’impact, la vitesse est bizarre, quand je donne un coup sec à ma souris, la vitesse de déplacement est trop lente, par contre, lorsque je déplace progressivement mon pointeur, la vitesse accélère normalement… je pige pas
Quelqu’un a un script (j’abandonne ma map 3D pour le moment, sa m’énerve trop pff.. malgrès tous les coup de mains que l’on m’a donnée, désolé les gars mais j’y arrive pas. Merci quend même les amis 😉 )
Utilise le timer interne (timer.device) entre 2 saisies de positions de souris ?
Voici mes routines Timer de l’AmiDARK Engine, cela pourra peut-être t’aider :
[code]uint OldTimer;
uint NewTimer;
// TimerHook * timerhook_new(struct MsgPort *timerPort);
// void timerhook_delete(TimerHook *timerHook);struct MsgPort *m_inputPort;
struct IOStdReq *m_inputRequest;
ULONG m_inputsigflag;
BOOL AmigaSYS_OpenDevice_Timer( void ){
BOOL mReturn = FALSE;
timerPort = MyCreateMsgPort();
if ( timerPort ){
timersigflag = 1 << timerPort->mp_SigBit;
timerRequest = ( struct TimeRequest * )MyCreateIORequest( timerPort, sizeof( struct TimeRequest ) );
if ( timerRequest ){
if ( ! ( MyOpenDevice( « timer.device », UNIT_MICROHZ, (struct IORequest *)timerRequest, 0 ) ) ){
TimerBase = timerRequest->Request.io_Device;
ITimer = (struct TimerIFace *)MyGetInterface( ( struct Library *)TimerBase, « main », 1 );
MyGetSysTime( MyTimeVal );
timerFirst = TRUE;
NewTimer = ( MyTimeVal->Seconds * 1000000 ) + MyTimeVal->Microseconds;
OldTimer = NewTimer;
mReturn = TRUE;
}
}
}
return mReturn;
}
void AmigaSYS_CloseDevice_Timer( void ){
/* First abort any current timer io */
if ( timerRequest && !timerFirst ){
MyAbortIO( ( struct IORequest *)timerRequest );
MyWaitIO( ( struct IORequest *)timerRequest );
MySetSignalIO( 0L, timersigflag );
}
if ( ITimer ){
MyDropInterface( (struct Interface *)ITimer );
ITimer = NULL;
}
if (TimerBase && timerRequest ){
MyCloseDevice( (struct IORequest *)timerRequest );
MyDeleteIORequest( (struct IORequest *)timerRequest );
if ( timerPort ){
MyDeleteMsgPort( timerPort );
timerPort = NULL;
}
TimerBase = NULL;
timerRequest = NULL;
}
}
void AmigaSYS_UpdateTimer( void ){
OldTimer = NewTimer;
MyGetSysTime( MyTimeVal );
NewTimer = ( MyTimeVal->Seconds * 1000000 ) + MyTimeVal->Microseconds; // %86400
}
[/code]
Et tu fais la différence entre OldTimer & NewTimer pour savoir le temps écoule entre les 2 saisies de la souris.
A partir de la, avec un petit calcul de mathématiques, tu pourras définir une vitesse en pixels/sec 😉
@+
Yes, mais ton code me sert, je vais utilisé un chrono (commande)
Starttimer(1) ; Je démarre un chrono externe à Holly, il ne se calcule pas en fonction de la vitesse d’éxecution du script.
StartTimer(2) ; 2ème chrono pour le temps entre chaque photo, sa évite d’utiliser la vitesse d’éxecution du script comme intervalle de temps entre chaque prise de photo des coordonnées de la souris
Function VitesseDeLaSouris()
Temps1=Gettimer(1) ; photo du temps pour prendre les coordonnées de la souris
PositionEnXdelaSouris=Xmouse
PostitionEnYdelaSouris=Ymouse
Temps2=Gettimer(2); Je prend des photo du temps 2
If Temps2>50
NouvellePositionEnXdelaSouris=Xmouse
NouvellePostitionEnYdelaSouris=Ymouse
<Routine pour calculer le déplacement que je connais pas>
ResetTimer(2)
PositionEnXdelaSouris=NouvellePositionEnXdelaSouris
PostitionEnYdelaSouris=NouvellePostitionEnYdelaSouris
Endif
Qu’en pensez-Vous, j’ai pas encore tester mais bon, par contre pour calculer la distance, est-ce
Deplacement=Racine carrée de ((PositionEnXdelaSouris+NouvellePositionEnXdelaSouris)²+(PostitionEnYdelaSouris+NouvellePostitionEnYdelaSouris)²)
J’ai bon les ami(e)s?
Merci des infos et pour le script
Pour adapter ton déplacement à la vitesse de déplacement de la souris, tu devrais faire varier la vitesse de l’objet à déplacer en fonction d’un logarithme.
Le logarithme te donnera un coefficient à appliquer afin de déterminer ta vitesse de déplacement.
Pour déterminer le paramètre à utiliser pour ton logarithme, tu peux faire une soustraction de ton ancienne position souris par rapport à la nouvelle (ou l’inverse, ça n’a pas d’importance), et utiliser cette valeur
octave:37> log(1) //ancienne valeur=2 , nouvelle =1
ans = 0
octave:38> log(2) //ancienne valeur=192, nouvelle=190
ans = 0.69315
octave:39> log(3) //etc.
ans = 1.0986(octave, c’est le nom du logiciel qui me sert de calculette).
En utilisant le logarithme, sa sert de donnée pour l’accélération?
Donc le logarithme c’est
Log(Distance de déplacement) mais cette valeur je la mais ou (combine intéressante pour mon moteur de jeux de voiture en vue de dessus)
je ne veux pas vraiment de donnée pour l’accélération vu que je déplace une raquette et qu’en fonction de la vitesse de cette raquette, dès la colision avec une balle, cette balle va plus ou moins vite (les angles d’attaques, je verrai sa plus tard). Le principe de shufflepuck cafe.
J’ai peut être tous simplement rien compris 😉
Merci
La valeur obtenue par le logarithme va te servir de coefficient à appliquer à tes valeurs de translation. Pour te faire une idée, le mieux est de faire des essais 🙂
N’hésite pas non plus à utiliser un traceur (genre Octave ou même Gnuplot qui est plus simple) pour «visualiser» ce qu’est un logarithme. Je ne suis pas bon en maths, et ce genre d’outils m’aide beaucoup.Effectivement pour ton jeu, le logarithme ne va pas servir si le déplacement est constant (ça pourrait pourtant être intéressant de faire varier la vitesse de la raquette).
Tu sembles vouloir le faire autrement, en calculant la norme du vecteur défini par le déplacement x,y de ta souris. Je n’y avais pas pensé, et c’est assez intéressant comme façon de faire:
Deplacement=Racine carrée de ((PositionEnXdelaSouris+NouvellePositionEnXdelaSouris)²+(PostitionEnYdelaSouris+NouvellePostitionEnYdelaSouris)²)
Avec cette formule, tu calcules la norme d’un vecteur que tu définis en X avec (position x + nouvelle position x) et en Y avec (position y + nouvelle position y). Donc tu obtiens une longueur, mais que ne sera exploitable que si ce qui importe pour toi est le déplacement d’une manière générale.
Si le fait de se déplacer en X ou en Y n’a pas d’importance (ce qui pourrait être possible pour un jeu style shufflepuck), c’est aussi une bonne méthode d’incrémentation. Voire même mieux dans ce cas que le logarithme (désolé j’avais lu un peu vite la première fois et je n’ai pas percuté).
Par contre, dernière petite remarque, mais moi je le ferais plutôt comme ça:
force déplacement = racine de ( (nouveau x – ancien x)² + (nouveau y – ancien y)²)
À essayer, mais ça me parait mieux. (pas trop le temps de détailler plus, je me sauve!)
Je vais essayé sa, je te tien au courant et je mettrais le code ici.
Par contre, j’ai la distance parcourue, grâce au temps, j’aurais la vitesse, mais l’angle!!?? Aïe, comment faire
la trigo a ton avis, du fait que en gros sa fais un triangle rectangle virtuelle, j’ai tout les côtés, si je me rappel bien le cos d’un triangle rectangle est COS a=Côtés adjacent/hypothénuse
Donc le cos sera:
Angle=(nouveauX-ancienX)/distance
Hop j’ai donc l’angle… Je me trompe ou pas?
Merci des retours
>Angle=(nouveauX-ancienX)/distance
>Hop j’ai donc l’angle… Je me trompe ou pas?Tu te trompe pas 🙂
et toujours
distance = racine de ( (nouveaux – ancienx)² + (nouveauy – ancieny)²)
cos=(nouveauX-ancienX)/distance
sin=(nouveauY-ancienY)/distanceInutile de te casser la tête avec le log() si tu veut faire décroitre ta vitesse ils suffit de la faire décroitre avec le temps
genre
vitesse=10
lancer la balle
while(balle avance)
{
x=x+cos*vitesse
y=y+sin*vitesse
tracerballe(x,y)
vitesse=0.90*vitesse
}Alain
Sa marche nickel… sa claque.
Bon je rend le code lisible et je le post
Merci caillin
T’a pu qu’a m’expliquer comment faire une map3D maintenant, avec des mots simple, histoire que je puisse comprendre lol
C’est pas gagner car même a 2 (Amidark) vous avez pas réussi 😀
PS: Faudrait que l’on se voit dans une party, déjà histoire que je te fasse un bisou, et surtout pour s’échanger des routines/combines 😉
Y’en a plein que je veux voir parmi la communauté (et même ceux qui croient que je les aimes pas alors que c’est pas vrai… z’êtes pas gentil), mais faut que je trouve le temps… il faut que j’arrive a me rendre dispo. Je négocie et c’est pas gagner. Mme Artblink est…. hum… casse machin… de temps en temps, en fait non, c’est une femme, c’est TOUT LE TEMPS…. lol
11 sujets de 1 à 11 (sur un total de 11)
- Vous devez être connecté pour répondre à ce sujet.
› Forums › AmigaOS, MorphOS et AROS › Développement › Calcul de la vitesse de déplacement de la souris