5/5 (2 avis)
Vue 9 312 fois - Téléchargée 985 fois
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.
6 août 2005 à 16:31
Encore merci.
a+ et bon code....
3 août 2005 à 20:27
Sinon c'est bien.
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.