Animation sous directx 7, tuto tiles 3

Description

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

Codes Sources

A voir également

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.