Directx tuto 1 : directdraw : afficher une image

Description

Salut !!
Voici mon tout dernier code, dans celui-ci j'ai mis comment faire pour ouvrir une fenetre en mode directdraw, afficher directement une image, mettre une couleur transparente à une image, ainsi qu'afficher du texte.
J'espere que mon code est assez commenté car directdraw c'est pas toujours facile.
Veuillez m'excuser pour mon orthographe lamentable.

J'ai mis entierement le code à jour

Source / Exemple :


Avant tous un zip est présent pour vous aidez....

Voici, après la très bonne remarque de Jotrash je vais tenté de faire un tuto pour expliquer le fonctionnement de directdraw.

Pour commencer directdraw est un composant de directx donc il faut déclarer directx dans les références du projet, pour ce qui ne savent pas comment faire, aller dans le menu Projet puis dans Référence cocher DirectX 7 for visual basic type library.

Maintenant que directx est inclus dans le projet, vous devez déclarer directx et directdraw. 
Pour afficher à l'écran on utilise des mémoires tampon (buffer) dans cette exemple  nous utiliserons un brouillon (Backbuffer) et une surface principale ou primaire (Primary), donc comme vous l'aurez compris tous les montages se font sur le buffer puis une fois le buffer terminer on le copie dans la surface principale pour l'afficher à l'écran.
Nous devons aussi déclarer une instance qui affichera constamment votre surface primaire à l'écran (ici bRunning).
 Dans notre module nous allons déclaré une sub main, qu'il faudra mettre en démarrage dans les options du projet, dans cette sub main nous allons créé toute les images, texte et autre idée que nous voudrions afficher puis les insérez dans le brouillon.
Nous allons aussi géré toute les erreurs pour éviter le plantage du pc, soit : 
on error goto errortrap, puis donner à bRunning l'autorisation d'afficher en mettant sont option à true

'' *** Début du code *** ''
Option Explicit
' Déclaration des instance directX
Public dx As New DirectX7
Public dd As DirectDraw7
Public Primary As DirectDrawSurface7
Public Backbuffer As DirectDrawSurface7

'Ici on déclare les variables permettant d'initialiser la surface principale
Public ddsd As DDSURFACEDESC2
Public ddscaps As DDSCAPS2

'Declaration des surfaces
Public Surface1 As DirectDrawSurface7
Public ddsdSurface1 As DDSURFACEDESC2
'DDSD represente le descripteur de l'image, et Surface la donnée en mémoire représentant les images.

Public Surface2 As DirectDrawSurface7
Public ddsdSurface2 As DDSURFACEDESC2

'Declaration d'un ColorKey qui permet de definir un couleur transparente
Public ck As DDCOLORKEY
'Declaration d'un rectangle vide, ca evite d'appeler Ddrect(0,0,0,0) plusieurs fois
Public DDR0 As RECT

'Declaration d'une variable pour la boucle
Public bRunning As Boolean

Public Function InitialisationDX()

'Maintenant il faut créer l'objet directdraw pour permettre à visual basic d'utiliser directx.
Set dd = dx.DirectDrawCreate("")
' Nous allons passez en mode plein écran, donc pour pouvoir retourner à l'écran d'origine on 'enregistre les info concernant votre affichage avant le passage en plein écran

dd.SetCooperativeLevel Form1.hWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE Or DDSCL_ALLOWREBOOT 

'DDSCL_FULLSCREEN = plein ecran, DDSCL_EXCLUSIVE = prend la plus haute priorité du processeur, DDSCL_ALLOWREBOOT = permet au gestionnaire de tache de prendre le 'dessus
dd.SetDisplayMode 640, 480, 32, 0, DDSDM_DEFAULT ' ici nous définissons un écran en '640*480 en 32 bits pas la peine de mettre 16 bit, nos processeurs sont en 32bits.

'**** Maintenant directx est complètement initialisé ainsi que le passage en plein écran ****
'** Création d'un objet surface pour afficher l'écran **
ddsd.ddscaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX Or DDSCAPS_VIDEOMEMORY 
'Nous disons que notre objet est attaché à la surface primaire donc que se sera notre écran '(DDSCAPS_PRIMARYSURFACE) et qu'il utilisera la mémoire vidéo.

ddsd.lBackBufferCount = 1 ' notre ddsd possède un buffer 
Set Primary = dd.CreateSurface(ddsd) ' et nous disons que la surface principale utilise des 'description de ddsd. 
'Nous avons donc une surface à afficher à l'écran seulement l'interét n'y est pas si on ne 'peux pas y afficher des images (dans le cas d'un jeu).

'**** Afficher une image ****
'Pour afficher une image nous devons créer une surface auxiliaires qui permettra l'affichage de 'l'image à l'écran.

ddscaps.lCaps = DDSCAPS_BACKBUFFER Or DDSCAPS_VIDEOMEMORY
'Notre surface auxiliaire utilise un buffer et la mémoire vidéo
Set Backbuffer = Primary.GetAttachedSurface(ddscaps) ' Cette surface auxiliaire est attaché 'au buffer

Call InitialisationSurface
bRunning = True
Call Rendu

End Function

Public Function InitialisationSurface()

'** Charger l'image dans la surface ***
Set Surface = dd.CreateSurfaceFromFile(App.Path & "\image.bmp", ddsd2)
'Nous disons que notre surface est créé par rapport a un fichier (CreateSurfaceFromFile ) avec 'les caractéristiques de ddsd2 et grâce a directdraw (dd)

End Function

Public Function Rendu()

'Maintenant nous avons une image dans une surface il nous faut afficher la form principale
 form1.show
'On affiche à l'écran la surface primaire
Primary.Flip Nothing, DDFLIP_WAIT

'On crée une boucle ou on affiche la surface image dans le buffer et ou passe le buffer au 'primaire
Do

    With Backbuffer
        'On remplis le buffer de blanc
        .BltColorFill ddRect(0, 0, 0, 0), QBColor(14) ' on se sert de ddrect comme 'surface, il est déclarer plus loin
        'On met la surface image dans le buffer
        .BltFast 0, 0, Surface, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT  

    End With

    Primary.Flip Nothing, DDFLIP_WAIT 'On passe le buffer dans le primaire, le primaire étant l'écran
                            'Une chose à savoir, si vous rajouter la propriété DDFLIP_NOVSYNC vous pourrez eviter la synchronisation verticale et augmenter votre frame rate. C'est utile pour voir si vos optimisations prennent effet.

    DoEvents    'Obligatoire pour ne pas risquer de Freeze votre pc

'Notre boucle est terminé sib Running est false
Loop Until bRunning = False

End Function

'**** Fermeture propre du programme ****
Public Sub UnloadDD()
    
    '**** Fermeture propre du programme ****
    bRunning = False
    Dd.RestoreDisplayMode
    Set Primary = Nothing
    Set Backbuffer = Nothing
    Set Dd = Nothing
    Set Dx = Nothing
    End

End Sub

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

''''****** DANS LA FORM1 *******
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 27 Then UnloadDD
End Sub

'Nous disons que si l'utilisateur appuie sur Echap on appelle UnloadDD
'Backbuffer.DrawText 200, 200, "Premiere utilisation de directdraw !", False
'Nous pouvons utilisé DrawText pour afficher du texte.
'200, 200 représente les coordonées d'affichage

'Dans le zip vous aurez plus d'information sur l'affiche d'une couleur transparent
' (colorkey)

Conclusion :


Si vous avez un une remarque ou n'importe quoi à dire sur ma source vous privé pas.

Je pense faire trés bientôt une source complémentaire, expliquant comment faire des déplacements avec directdraw, et ajouter des sons.

bonne prog .....

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.