Directx tuto 2 : directinput : le clavier et directdraw

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

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.