Dans ce tuto je vais vous expliquer les bases de l?animation avec directx 7. Ces bases sont bien entendu utilisables avec les tiles. Cependant les tiles sont mises à l'ecart pour le moment.
N'oublié pas que je pars sur l'idée que vous avez deja les connaissances de mes précédents tuto.
Source / Exemple :
Tout d?abord nous partons du tuto sur les tiles numéro 2. Ceci nous permettra d?éviter de devoir retaper tout le chargement des map et des tiles. Donc après la déclaration de DX et du BackBuffer nous allons rajouter la déclaration de DirectInput bien entendu pas d?explication car j?ai fait un tuto exprès pour ça.
?Les 3 variables obligatoires pour direct input, POUR LE CLAVIER SEULEMENT.
Public DI As DirectInput
Public DIdevice As DirectInputDevice
Public DIstate As DIKEYBOARDSTATE
'DirectInput
Set DI = dx.DirectInputCreate()
Set DIdevice = DI.CreateDevice("GUID_SysKeyboard")
DIdevice.SetCommonDataFormat DIFORMAT_KEYBOARD
DIdevice.SetCooperativeLevel hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
DIdevice.Acquire
Voila DI est déclaré. Maintenant nous allons rajouter le chargements des images du perso. Cependant un problème se pose, un perso n?est pas un carré comme les tiles, peut importe nous utiliserons les ColorKey, expliqués aussi dans un autre tuto précédents.
Les différentes variables pour charger des images (ici le perso) :
Public SPerso(17) As DirectDrawSurface7
Public ddsdSPerso(17) As DDSURFACEDESC2
Le ColorKey :
Public ckWhite As DDCOLORKEY
Maintenant on charge les images sur les surfaces :
Declaration d'une couleur transparante :
ckWhite.high = RGB(255, 255, 255)
ckWhite.low = RGB(255, 255, 255)
For i = 0 To UBound(SPerso)
Set SPerso(i) = dd.CreateSurfaceFromFile(App.Path & "\Image\" & i & ".bmp", ddsdSPerso(i))
SPerso(i).SetColorKey DDCKEY_SRCBLT, ckWhite
Next i
Ensuite dans la boucle principale :
Do
DoEvents
Loop Until bRunning = False
Vous rajoutez avant le doevents :
Backbuffer.BltFast PersoX, PersoY, SPerso(Perso_Index), ddRect(0, 0, 0, 0), DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT
Alors PersoX sera les coordonnées de la position en X du perso PersoY les coordonnées de la position en Y du perso ensuite on affiche la surface SPerso avec Perso_Index, donc de nouvelles variables à déclarer.
Public PersoX As Long, PersoY As Long
Public Perso_Index As Integer
Ensuite vous rajoutez en dessus de DoEvents :
Clavier_Perso
Maintenant nous créons une nouvelle fonction, qui utilisera un systeme de timer et DI :
Public Timer1 As Long, Timer1_2 As Long, Timer1State As Integer
Public Perso_Deplacement As Integer
Public Function Clavier_Perso()
Dedans cette fonction il ne reste plus qu?a paramétré le mouvement du personnage suivant la touche du clavier que l?on appuis. Alors Perso_Deplacement va servir de témoin de la touche qu?on enfonce :
Gauche = 1, Haut = 2, Droite = 3, Bas = 4
Donc on recupere le statu des touches :
DIdevice.GetDeviceStateKeyboard DIstate 'on rentre les valeur des touches activé dans DIstate
Puis selon les touches enfoncé on donne la valeur correspondante à Perso_Deplacement :
If DIstate.Key(DIK_LEFT) Then
Perso_Deplacement = 1
ElseIf DIstate.Key(DIK_UP) Then
Perso_Deplacement = 2
ElseIf DIstate.Key(DIK_DOWN) Then
Perso_Deplacement = 3
ElseIf DIstate.Key(DIK_RIGHT) Then
Perso_Deplacement = 4
Else
Perso_Deplacement = 0
End If
On a presque terminé, il faut juste donné le mouvement au personnage.
Récupération du temps actuel.
Timer1 = dx.TickCount
If Timer1State = 0 Then
Si on a jamais récupéré de premier temps ou qu?on doit le reprendre.
Timer1_2 = dx.TickCount
Timer1State = 1
End If
Puis au lieu de faire plusieur If Perso_Deplacement = ? On met un Select Case.
Select Case Perso_Deplacement
Case 1
Ici on retrouve le Perso_Index qui est en faite l?image qui s?affichera à l?écran.
On donne la valeur à Perso_Index qui correspond a la bonne image
If Perso_Index < 14 Then Perso_Index = 14
Si le timer supérieur a 150 ms alors on prend l?image suivante et on dis qu?on doit reprendre le temps actuel.
If Timer1 - Timer1_2 > 150 Then
Perso_Index = Perso_Index + 1
Timer1State = 0
End If
Si on est allé trop loin dans les images on retourne à la première image du deplacement.
If Perso_Index > 17 Then Perso_Index = 14
On change la position du personnage pour l?animer.
PersoX = PersoX - 2
Case 2
Pour la suite le code est le même mais avec des numéro d?image différent.
If Perso_Index < 0 Then Perso_Index = 0
If Timer1 - Timer1_2 > 150 Then
Perso_Index = Perso_Index + 1
Timer1State = 0
End If
If Perso_Index > 4 Then Perso_Index = 0
PersoY = PersoY - 2
Case 3
If Perso_Index < 10 Then Perso_Index = 10
If Timer1 - Timer1_2 > 150 Then
Perso_Index = Perso_Index + 1
Timer1State = 0
End If
If Perso_Index > 13 Then Perso_Index = 10
PersoY = PersoY + 2
Case 4
If Perso_Index < 5 Then Perso_Index = 5
If Timer1 - Timer1_2 > 150 Then
Perso_Index = Perso_Index + 1
Timer1State = 0
End If
If Perso_Index > 9 Then Perso_Index = 5
PersoX = PersoX + 2
End Select
Voila, maintenant votre personnage ce déplace sur votre carte avec une vrai animation. Bien entendu pour tout autre type d?animation le procédée est le même. L?avantage de la méthode du timer est que pour n?importe qu?elle processeur l?animation aura la même vitesse, alors que si on ne « timé » pas sa dépendrai de la vitesse du processeur.
Conclusion :
Je ne connais pas de bug, mais il peut y en avoir. Donc amusé vous bien, si vous avez une quelconque remarque mettez un commentaire.
Pour le fichier d'exemple le personnage est celui de Zelda : A link to the past
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.