Fluidite d'un mouvement.

Résolu
cs_bobo91 Messages postés 107 Date d'inscription dimanche 27 juin 2004 Statut Membre Dernière intervention 12 novembre 2006 - 6 août 2004 à 11:59
cs_RDX Messages postés 117 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 27 août 2005 - 7 août 2004 à 14:40
bonjour tout le monde.

INFO:je programme en vb6
j'ai faisle deplacement d'un objet a l'aide d'un timer seulement le timer ne semble pas assez rapide dans le cas ou je fais un deplacement de 1 en 1 et un timer a 1ms et plus je vais
augment l'incrementation du deplacement et plus ca choquera au niveau des acous.de plus que il doit surement avoir une relation mathematique qu'il faut appliquer car j'ai l'impression que si je fais un deplacement lineaire il va beaucoup plus vite qu'un deplacement oblique ou autre je peux me trompe c'est peut etre un effet d'optique.
donc j'aimerais si quelqu'un connais une technique pour rendre un deplacement fluide.
a bientot.
merci de votre aide et bonne prog.

7 réponses

cs_RDX Messages postés 117 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 27 août 2005
6 août 2004 à 22:56
Salut!

Deja, pour optimiser ton code, je te suggère de travailler sur des variables, pas directement sur les propriétés de shape1.

Donc c'est mieux de faire ca:
------------------------
option explicit

Dim X as long

Private sub Form_Load()
Timer1.Interval = 1
end sub

Private Sub Timer1_Timer()
X=X+10
Shape1.Left =X
End Sub
-----------------------

Moi je te propose même de te passer du timer, parce que a partir d'un intervalle de 50ms, c'est plus vallable. Colle ca dans ton formulaire, avec un bouton nommé command1 pour lancer l'anim, et un bouton command2 pour l'arreter, et shape1.

-----------------------
Option Explicit
Dim X As Long
Dim time1 As Long 'Variable pour stocker le temps

Const Intervale As Long = 1 'intervalle du "timer"

Dim BlnStop As Boolean 'true = arret de l'anim

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub command1_click()
BlnStop = False

Do
X = X + 20
Me.Line (X - 20, 100)-(X, 200), vbBlack, BF
Me.Line (X, 100)-(X + 200, 200), vbWhite, BF
time1 = GetTickCount()
Do Until GetTickCount - time1 >= Intervale
Loop
DoEvents
Loop Until BlnStop
End Sub

Private Sub command2_click()
X = 0
BlnStop = True
End Sub

Private Sub Form_Load()
BlnStop = False
me.backcolor=0
End Sub

Private Sub Form_Unload(Cancel As Integer)
BlnStop = True
End Sub
----------------------------------

Le mieux ca serait encore de travailler avec les fonctions graphiques, ca clipperait moins.

Mais de toute facon, faut pas rever, avec vb, tu n'aura jamais la possibilité de faire de 1000 fps (je me demande d'ailleurs si c'est possible actuellement, meme avec directX, quoique...). La tu as 1 milisec d'intervalle en théorie, mais en pratique tu doit en avoir une 20aine, peut etre 10 si ton pc est assez rapide... (temps de calcul des autre variable de temps, de positions, le fameux DOEVENTS...)

Pour infos :

- Une image toutes les milisecondes ca fait mille images par sec.
- 25 images par seconde ca fait une image tout les 40 ms... (soit 40 fois moins rapide que ce que tu veux faire, t'étonne pas si ca devient difficile a 1000 image par seconde!)

Bye!
3
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 août 2004 à 12:18
Salut,
Sur l'animation, g vu un source intéressant ici :
http://www.vbfrance.com/code.aspx?ID=24980
Tu pourrais t'en inspirer ?

Cordialement

CanisLupus
0
cs_bobo91 Messages postés 107 Date d'inscription dimanche 27 juin 2004 Statut Membre Dernière intervention 12 novembre 2006
6 août 2004 à 12:45
bonjour canis lupus

je te remerci de m'avoir guider sur cette source.
je vien de voir la source mais encore la on peu pas voir trop le defaut du deplacement car c'est une petite surface.
lui ca ne se voi pa a l'oeil nue c'est normal.

moi ce ke j'ai fais c'est une fenetre pleine ecran avec un fond blanc et un petit care noire qui se deplace de a droite tout le long de la fenetre.

voila la source:

Private Sub Timer1_Timer()
Timer1.Interval = 1
Shape1.Left = Shape1.Left + 10 'la c'est apeu pres fluide mais on vois encore des acous
End Sub

mon prob c'est que si je met 50 par exemple pour alle plus c'est lent la j'augmente la valeur 10 mais plus je vais augmenter et plus la distance entre chaque deplacement d'image choquera.
deja tu peux essayer avec 50 au lieu de 10 et tu vera ke c'est naze la.

j'y comprend plus rien la quand on regarde un film a 25 images par secondes y'a pas d'accous pourtant.
et la je lui met 1 image toute les miliseconde la fo m'expliquer parce ke la y'a un truc.
merci encore

help me please.
0
cs_RDX Messages postés 117 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 27 août 2005
6 août 2004 à 23:01
Euh j'ai oublié de mettre dans form_load()

me.scalemode=3 'pixel
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bobo91 Messages postés 107 Date d'inscription dimanche 27 juin 2004 Statut Membre Dernière intervention 12 novembre 2006
6 août 2004 à 23:25
bonsoir RDX merci infiniment de ton aide c'est vrai ke la ca clake au niveau de la fluidite et sans timer en plus.
ca va meme beaucoup plus vite qu'un timer au plus petit pourquoi?.
y'a po plus fluide ca me suffi largement lol merci encore.
juste une petite question peu tu explike le principe du GetTickCount car je connais po du tous cette api.
je ne comprend pas comment elle fonctionne dans ton code.
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
6 août 2004 à 23:38
Salut :
Je peut peut-etre t'aider si tu cherche de la fluidité :
j'ai fait une source avec des équations, tout est géré par les fonctions, va voir à l'adresse :
http://www.vbfrance.com/code.aspx?ID=24161

PS : tu dit que ça va plus vite qu'avec un timer plus petit, c'est surment parce que si tu lance des timers toutes les 1ms, ça fera plus travailler le processeur donc ça peut ralentir, peut etre aussi que le temps d'éxecution du timer est plus grand que 1ms, donc les timers se chevauchent entre eux...
une petite astuce :
private sub timer1_Timer()
timer1.Enabled=false
....
timer1.enabled=true
end sub

(comme ça tu est sur que les timers se chevauchent pas)

@ ++
MadMatt
0
cs_RDX Messages postés 117 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 27 août 2005
7 août 2004 à 14:40
Pour l'api gettickcount je t'ai mis un message privé.
0
Rejoignez-nous