begin process at 2012 02 16 04:44:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Direct X

 > ANIMATION SOUS DIRECTX 7, TUTO TILES 3

ANIMATION SOUS DIRECTX 7, TUTO TILES 3


 Information sur la source

Note :
7,67 / 10 - par 6 personnes
7,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Direct X Classé sous :tile, directx, animation, map Niveau :Débutant Date de création :25/04/2005 Date de mise à jour :20/02/2006 21:16:50 Vu / téléchargé :7 388 / 749

Auteur : ciberrique

Ecrire un message privé
Site perso
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 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

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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

25 avril 2005 15:46:50 :
J'avais coché .net sans faire exprés ...
20 février 2006 21:16:50 :
J'ai ajouter les mot clés pour la recherche.

 Sources du même auteur

Source avec Zip TUTO DIRECT3D 1 : INITIALISATION
Source avec Zip Source avec une capture TUTO 11 DIRECTX : DIRECTSHOW LES VIDEO DANS VOS JEUX.
Source avec Zip Source avec une capture TUTO TILE 7 : PASSAGE À L'ISOMÉTRIQUE
Source avec Zip Source avec une capture LECTEUR DE FICHIER MS3D ASCII
Source avec Zip Source avec une capture METHODE SUPERMAP, TUTO TILES 6 !

 Sources de la même categorie

Source avec une capture HAPPY LAND - 3D VB6 GAME - OPEN SOURCE CODE par ZaidMarkabi
Source avec une capture METAL GEAR SOLID - 3D VB6 GAME - OPEN SOURCE par ZaidMarkabi
Source avec une capture FIGHT COMBAT II - 3D VB GAME - OPEN SOURCE par ZaidMarkabi
Source avec Zip Source avec une capture UTILISER LA CAMERA POUR DIRECTX par zulrigh
Source avec une capture STREET FIGHTER - 3D VB GAME - OPEN-SOURCE par ZaidMarkabi

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture ENVIRONEMENT 3D A LA PREMIÈRE PERSONNE. DIRECTX8 par djine
Source avec Zip Source avec une capture TUTO TILE 7 : PASSAGE À L'ISOMÉTRIQUE par ciberrique
Source avec Zip Source avec une capture EDITEUR DE MATRICE POUR LES TILES par ciberrique
Source avec Zip UTILISATION DE TILES DANS UN JEU : TUTO 2 par ciberrique
Source avec Zip UTILISATION DE TILES DANS UN JEU : TUTO 1 par ciberrique

Commentaires et avis

Commentaire de ABF le 03/08/2005 20:27:40

Slt, tu vas me trouvé rabajoi mais j'ai trouvé un bug: descens complètement en bas de l'ecran, le perso reste bloqué.
Sinon c'est bien.

Commentaire de ciberrique le 06/08/2005 16:31:44

lol, tu me fais rire, je prefere des critiques comme les tiennes que celle que j'ai pus lire sur d'autre post. Au moins tu es constructif. Cependant tu as remarqué que les sources n'étaient pas à jour c'est a cause d'un probleme personel, je verrai en septembre si je peux mettre a jour.
Encore merci.
a+ et bon code....

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Directx et .x ... comment importer un mesh animé ? [ par SyDGiN ] Salutbravo pour le siteComment importer un mesh créé depuis truespace 5 en .x, qui comporte une animation. (une boule qui tourne..). Lorsque j'exporte Animation 3d directx [ par ciberrique ] Bonjours, j'ai un probleme, je n'arrive pas &#224; annim&#233;&nbsp;des objet&nbsp;3d sous direct3d&nbsp;avec des structures... En effet je suis sur l [VB.NET 2008] DirectX : Connaitre la position d'un mesh pendant l'animation [ par Shadowbiwan ] Salut a tousAlors voilà, Depuis peu je me décidé à me remettre a DirectX et tant qu'à faire, à passer à la 3D. Après des semaines de recherches et de bouton animé en DirectX [ par vanpet ] je fait mon interface en DirectX avec DirectDraw et je voudrai que lorsqu'on passe avec la souris sur certaines images, une petite animation se mette directx [ par lilie ] J'ai une instruction qui s'appelle :"g_D3DDevice.Drawprimitive D3DPT_Trainglestrip,4*(100)*(100)-2"Les valeurs 100 correspondent à des constantes donn Transparence sur un objet DirectX par une fonction API [ par Tchitchi ] Salut tlm!!Je recherche une fonction API (ou une autre solution) pour pouvoir créer une surface directX dont le fond est transparent (par exemple une AU SECOURS!!!! [ par Tchitchi ] Salut tlm!!Je recherche une fonction API (ou une autre solution) pour pouvoir créer une surface directX dont le fond est transparent (par exemple une afficher une page web dans l'animation [ par n2jf ] j'aimerais afficher une page web dans une partie de mon animation flash et pas dans une fenêtre à part.voilà ça serait sympa de repondre@+ HELPPP SVP DIRECTX 7 SDK [ par WolfSpirit ] Salut!! Je cherche desesperement le SDK de DirectX version 7.x avec surtout la documentation pour programmer en VB! si kelkun c ou je pe la trouver ca doc DirectX 7... [ par WolfSpirit ] Bonjour je cherche la doc de DirectX 7 pour VB est ce ke kelkun l'a SVP ?? merci.


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,058 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales