Accueil > > > ANIMATION SOUS DIRECTX 7, TUTO TILES 3
ANIMATION SOUS DIRECTX 7, TUTO TILES 3
Information sur la source
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
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
Sources de la même categorie
Commentaires et avis
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 à annimé des objet 3d sous direct3d 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.
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|