Directx tuto 2 : directinput : le clavier et directdraw

Soyez le premier à donner votre avis sur cette source.

Vue 5 109 fois - Téléchargée 586 fois

Description

Voila dans se deuxième tuto je met en accord DirectInput et DirectDraw, comme sa vous pourrez voir comment faire pour faire avancé une voiture ou un personnage.

Voila source et tuto mis à jour.

Source / Exemple :


'Dans se deuxième tutorial je par sur la base que vous savez afficher une image par Direct Input, du moins que vous avez au moins parcouru mon premier tuto sur Input

'On utilise une api pour cacher le curseur :
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

'Donc tous d'abord on fait la déclaration normale de Input :

Public dx As New DirectX7
Public dd As DirectDraw7
Public Primary As DirectDrawSurface7
Public Backbuffer As DirectDrawSurface7
Public bRunning As Boolean
'Maintenant les objets direct input :
'Objet servant à la gestion des entrées de l'ordinateur
Public DI As DirectInput
'Un device pour récupérer les données du clavier
Public DIdevice As DirectInputDevice
'Un tableau dans lequel sont stockées l'état de toutes les touches.
Public DIstate As DIKEYBOARDSTATE
'Et les variables qui nous servirons
' Variable pour la flèche de droite et celle de gauche
Public scroldroite, scrolgauche
'Variable gérant la position de notre image
Public posx, posy, reelx, reely

'***** Nous rentrons dans la sub principale *****

Sub Main()
On Error GoTo ErrorTrap
'Nous donnons des valeurs à nos variables
posx = 5: posy = 5: reely = 200: reelx = 0

'Nous cachons la sourie
ShowCursor False

bRunning = True

'*******Déclaration des objets pour le clavier, obligatoire pour DirectInput

Set DI = dx.DirectInputCreate()
  Set DIdevice = DI.CreateDevice("GUID_SysKeyboard")
  DIdevice.SetCommonDataFormat DIFORMAT_KEYBOARD
  DIdevice.SetCooperativeLevel Form1.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE

'Nous disons qu'on relève toute les touches tapé, à ne pas oublier sinon marche pas
   DIdevice.Acquire

'***Déclarations des objets pour l'écran, comme normal
Set dd = dx.DirectDrawCreate("")
dd.SetCooperativeLevel Form1.hWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE Or DDSCL_ALLOWREBOOT
dd.SetDisplayMode 640, 480, 16, 0, DDSDM_DEFAULT

'*******création d'une surface principale********

Dim ddsd As DDSURFACEDESC2
ddsd.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
ddsd.ddscaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX Or DDSCAPS_VIDEOMEMORY
ddsd.lBackBufferCount = 1
Set Primary = dd.CreateSurface(ddsd)

'**** création de la surface auxiliaire ****
Dim ddscaps As DDSCAPS2
ddscaps.lCaps = DDSCAPS_BACKBUFFER Or DDSCAPS_VIDEOMEMORY
Set Backbuffer = Primary.GetAttachedSurface(ddscaps)

'******* création d'une nouvelle surface pour afficher une image *******
Dim Surface As DirectDrawSurface7
Dim ddsd2 As DDSURFACEDESC2
Set Surface = dd.CreateSurfaceFromFile(app.path & "\van.bmp", ddsd2) 'ici une voiture

'Creation d'une couleur transparente

Dim ck As DDCOLORKEY
ck.high = RGB(255, 255, 255)
ck.low = RGB(255, 255, 255)
Surface.SetColorKey DDCKEY_SRCBLT, ck 'on affecte la couleur à notre image

'On crée une surface servant de support (route)
Dim route As DirectDrawSurface7
Dim ddsdroute As DDSURFACEDESC2
Set route = dd.CreateSurfaceFromFile(app.path & "\route.bmp", ddsdroute)

Form1.Show ' on affiche la form1
Primary.Flip Nothing, DDFLIP_WAIT ' on met la surface primaire à l'écran

On Error Resume Next
Do
Backbuffer.BltColorFill ddRect(0, 0, 0, 0), QBColor(14) ' on remplis le buffer de blanc

Backbuffer.BltFast 0, 285, route, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT 'on place la route
Backbuffer.BltFast 320, 285, route, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT 'toujours la 'route

'Grâce au variable des positions réel de x et y on peut paramétrer pour faire une route infinie 
'La positions de x et y est replacer soit à 0 si la voiture sort a droite soit a 600 si elle sort a 'gauche
If reelx > 600 Then reelx = 0 ' à droite
If reelx < 0 Then reelx = 600 ' à gauche

'******* ici nous nous servons du clavier pour déplacer la voiture *******

'***** MISE A JOUR ICI ***********

' ** * * * Pour la flèche de droite.

If scroldroite = 1 Then
'Notre position réel de l'objet est incrémenté de la variable posx
reelx = reelx + posx
' On dis que la flèche de droite n'est plus activé pour pas que la boucle soit infinie
scroldroite = 0
End If

' ** * * Pour la flèche de gauche
If scrolgauche = 1 Then
'Notre position réel de l'objet est décrémenté de la variable posx
reelx = reelx - posx
' On dis que la flèche de droite n'est plus activé pour pas que la boucle soit infinie
scrolgauche = 0
End If

Backbuffer.BltFast reelx, reely, Surface, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY ' on affiche dans le backbuffer notre image avec pour coordonnée reelx, reely

'******* FIN  DE MISE A JOUR *********

Primary.Flip Nothing, DDFLIP_WAIT

'Si la surface est perdu on la restore
If Err.Number = DDERR_SURFACELOST Then
Primary.restore
End If

clavier ' on appelle la fonction clavier, c'est elle qui va géré nos variable scrolgauche et 'scroldroite
DoEvents
Loop Until bRunning = False

Exit Sub
ErrorTrap:
End
End Sub

'**** déclaration de la fonction rect ****
Public Function ddRect(x1 As Long, y1 As Long, x2 As Long, y2 As Long) As RECT
ddRect.Left = x1
ddRect.Right = x2
ddRect.Top = y1
ddRect.Bottom = y2
End Function

Public Sub UnloadDD()
'**** Fermeture propre du programme ****
bRunning = False
dd.RestoreDisplayMode
Set Primary = Nothing
Set Backbuffer = Nothing
Set dd = Nothing
Set dx = Nothing
Set DI = Nothing
Set DIdevice = Nothing
ShowCursor True

'***** MISE A JOUR ********
DIdevice.Unacquire        ' On libére l'acquisition du clavier
'***** FIN DE MISE A JOUR ******
End
End Sub

'**** Routine du clavier
Sub clavier()
'Ici on déclare une variable i qui sera la pour tester la valeur des touches
Dim i
'On acquière les touches dans la variable DIstate
DIdevice.GetDeviceStateKeyboard DIstate 

'******** MISE A JOUR ICI ********
If DIstate.Key(DIK_RIGHT)  Then scroldroite = 1 'si c'est la touche de droite notre 'valeur scroldroite vos 1
If DIstate.Key(DIK_LEFT) Then scrolgauche = 1 ' si c'est la touche de gauche notre 'valeur scrolgauche vos 1
End Sub

' C'est grâce à cette routine que l'on peut faire le test pour voir si nos touche sont 'enclenchées.

'******** FIN DE MISE A JOUR ***********

Conclusion :


Aussi je m'excuse pour les fautes d'orthographe car je suis vraiment mauvais.
Mais ce n'est pas la qualitée de l'orthographe mais du code qui compte ....
Prochain tuto scrolling pour les animations, on va y arriver a notre jeu !

Mise à jour, j'avais oublié les codes des touches :

Touche classique :

DIK_x touche x (x=0..9,A..Z).
DIK_Fx touche de fonction Fx (x=1..15)
DIK_NUMPADx touche x du pavé num (x=0..9)

Modificateurs :

DIK_LSHIFT Shift gauche
DIK_RSHIFT Shift droit
DIK_LCONTROL Ctrl gauche
DIK_RCONTROL Ctrl droit
DIK_LMENU Alt gauche
DIK_RMENU Alt droit
DIK_CAPITAL verrou capitale

Touches spécials :

DIK_SPACE espace
DIK_PRIOR page précédente
DIK_NEXT page suivante
DIK_HOME début
DIK_END fin
DIK_LEFT flèche gauche
DIK_RIGHT flèche droite
DIK_UP flèche haut
DIK_DOWN flèche bas
DIK_INS insérer
DIK_DEL efface à droite
DIK_ENTER entrée
DIK_TAB tabulation
DIK_BACK efface à gauche

Bonne prog, et pour ce qu'ils veulent en savoir un peu plus sur DirectInput, allé voir à cette adresse, même le joystick y est expliqué !!!

http://www.univ-reims.fr/UFR/Info/Image/DirectX/Lecon05-Peripheriques.pdf

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_azerty25
Messages postés
1115
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007
-
J'ai testé le ZIP, qq problemes, quand on fait aller le van en arriere, on dirait qu'il se double en fait il y a le van réel, et derriere, on dirait qu'il y a comme un 2eme qui le suis à qq pixels de décalage vers la droite. Un style d'ombre. Il y a aussi le fait que le van disparait de l'écran quand le moindre pixel déborde de l'écran alors que dans la logique, il devrait se masquer au fur et à mesure.
Sinon, je passe aux éléments flous dans ma tete de débutant DX, pourquoi tu fait un BltFast 2 fois ici :
Backbuffer.BltFast 0, 285, route, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT 'on place la route
Backbuffer.BltFast 320, 285, route, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT 'toujours la 'route
Il y a aussi ceci :
For i = 203 To 205 ' i de 203 à 205 pour les touche droite et gauche
If DIstate.Key(i) <> 0 Then 'si une touche est pressé
If DIstate.Key(DIK_RIGHT) <> 0 Then scroldroite = 1 'si c'est la touche de droite notre 'valeur scroldroite vos 1
If DIstate.Key(DIK_LEFT) <> 0 Then scrolgauche = 1 ' si c'est la touche de gauche notre 'valeur scrolgauche vos 1
End If
Next i
End Sub

DIstate.Key(i) testerai si la touche i est enfoncée, mais pourquoi mettre apres une vérification de DIstate.Key(DIK_LEFT) alors que tu l'a déja fait sous une autre forme ?!
ciberrique
Messages postés
591
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
-
Désolé quand j'ai ecris se code j'était pas au top (héhé je le suis toujours pas) en faite oui le For i = 203 To 205 est inutile

et pour le double bltfast essaye d'en enlevé un tu comprendras.....

J'ai constaté le dédoublement de pixel je pense que en faite l'image précédente n'est pas effacé en meme temps que la nouvelle, il faudrai inverser une instruction, mais je me suis pas penché dessus, dsl ....
Pour la disparition de l'ecran c'est normal je ne traite pas dans se tuto de tout le scrolling en detail mais juste d'un base.

a++
cs_azerty25
Messages postés
1115
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007
-
Oké oké, pour la route, c'est vrai qu'en testant on voit mieux. Un truc par contre qui à mon gout n'est pas tres bon, c'est que tu considère que la résolution sera toujours la même, par exemple pour la route, tu vois, tu fait 2 fois un blt pour faire toute la largeur, mais dans un vrai jeu, on peut choisir la reso, tu met 1024 et hop la route n'est pas complete sur tout l'écran :p Il n'éxiste pas une fonction stretch en DX ? (pour l'étaler sur la totalité de la largeur, il n'y aurait pas de déformation, les traits de la route sont horizontaux)
Sinon, j'ai essayé de mettre en 32 bits, et le blanc devient bleu, sait tu pourquoi ?
Sinon pour le doublement, c'est simple voici la partie qui clochait corrigée :

'Si la fleche de droite est activé
If scroldroite = 1 Then
reelx = reelx + posx
scroldroite = 0
End If


'Si la fleche de gauche est activé
If scrolgauche = 1 Then
reelx = reelx - posx
scrolgauche = 0
End If

Backbuffer.BltFast reelx, reely, Surface, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY

Primary.Flip Nothing, DDFLIP_WAIT
En résumé, tu dessinai 2 fois sur l'écran 2 images qui étaient différentes dans le cas ou l'on allait en arriere
ciberrique
Messages postés
591
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
-
Et voila la solution, héhé pour ton probléme de résolution du utilise des variables et selon la variable sa change, pour le stretch c plus un bltfast mais un blt normal et la tu peux faires des agrandissements.
pour la couleurs c'est bizare, mais bon je vois pas pk.
j'espere que j'ai repondu à tes questions ....
cs_azerty25
Messages postés
1115
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007
-
D'accord, je te remercie, et merci aussi pout tes tutos qui sont tres instructifs, demain je passe aux suivants ;)

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.