Calcul de la vitesse de déplacement de la souris

11 sujets de 1 à 11 (sur un total de 11)

  • Anonyme

      #177374

      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 😉 )

      AmiDARK

        #177379

        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 😉

        @+

        Tarzin

          #177391

          Et là , il va te dire que ta routine ne colle pas dans Hollywood 😉

          AmiDARK

            #177394

            Arf! C’est vrai qu’il code sous Hollywood le bougre :p
            Alors … Désolé 🙁

            Anonyme

              #177397

              @Amidark:

               

              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

              modulo

                #177398

                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).

                Anonyme

                  #177400

                  @Modulo:

                  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

                  modulo

                    #177404

                    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!)

                    Anonyme

                      #177408

                      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

                      thellier

                        #177713

                        >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)/distance

                        Inutile 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

                        Anonyme

                          #177750

                          @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

                        Amiga Impact