MODE PLEIN ECRAN - FLIPPING

Dans cet article, nous couvrirons les bases de l'initialisation d'un écran DirectDraw [celui de l'utilisateur] en mode plein écran et l'affichage d'images sur cette dernière via la technique du Flipping.

Vous pouvez télécharger le projet exemple de cet article: Code Source Du Projet : ddFlipping.zip

Notion de Surface Primaire, Surface Backbuffer

Le temps est venu d'utiliser les surfaces Primaire et Backbuffer. Le principe est simple:

Vous dessinez, écrivez sur vos Surfaces Simples, vous les blittez ensuite sur la surface backbuffer (une sorte de surface brouillon) et ensuite vous flippez (un peu comme un blit) le backbuffer sur la surface primaire. On a à la fin toutes nos images sur l'écran de l'utilisateur.

Afin de distinguer les différentes surfaces (simple, primaire ou backbuffer), vous devez définir leur description différemment dans l'objet DDSURFACEDESC2.

Création d'une Surface Primaire

La surface Primaire ou Principale est celle qui s'affiche sur l'écran de l'utilisateur.
On définit d'abord la surface:

Public Primary As DirectDrawSurface7

Ensuite on la crée avec pour description un objet DDSURFACEDESC2.

  Dim ddsd As DDSURFACEDESC2
  'On prévient qu'on va définir des Caps (?) et le
  'nombre de backbuffer
  ddsd.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
  'C'est une surface Primaire, "Flippable", "Complexe"

  'qui utilise la mémoire Video
  ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX Or DDSCAPS_VIDEOMEMORY
  'Il possède un BackBuffer
  ddsd.lBackBufferCount = 1
  'On crée la surface primaire avec les descriptions
  'contenues dans ddsd
  Set Primary = DD.CreateSurface(ddsd)

Bien la surface Primaire est crée, passons au backbuffer.

Création d'une Surface Backbuffer

La surface Backbuffer ou Surface Secondaire ou Surface Tampon ou Backbuffer tout simplement est en quelque sorte une surface Brouillon où vous faites tous vos arrangements. Vous flippez ensuite la surface Backbuffer vers la surface Primaire.

Pour les non-speaking english:
Buffer = mémoire tampon

On définit d'abord la surface:

Public Backbuffer As DirectDrawSurface7

Il faut maintenant l'attacher à la surface Primaire. Ainsi lorsqu'on appellera la fonction Flip de l'objet Primary, c'est la surface Backbuffer qui sera transférée vers la surface Primaire.

'On déclare un CAPS
Dim ddscaps As DDSCAPS2
'On définit les propriétés du CAPS: c'est un backbuffer,
'il utilise la mémoire video
ddscaps.lCaps = DDSCAPS_BACKBUFFER Or DDSCAPS_VIDEOMEMORY
'On attache le backbuffer à la surface Primaire
Set Backbuffer = Primary.GetAttachedSurface(ddscaps)

On crée ensuite une surface contenant une image nommée image.bmp et on présente la feuille.

Dim Surface As DirectDrawSurface7
Dim ddsd2 As DDSURFACEDESC2
Set Surface = DD.CreateSurfaceFromFile(App.Path & "\image.bmp", ddsd2)


'Présente la feuille
Form1.Show

Il faut maintenant afficher la surface primaire sur l'écran: technique du flipping.

Affichage sur l'écran - Flipping

Pour voir la surface primaire sur l'écran, il faut la flipper.

Primary.Flip Nothing, DDFLIP_WAIT

Ici, on demande à DirectDraw qu'il attende que le flip soit fini avant de continuer.

Pour les non-speaking english:
To Flip = Projeter

La boucle Do-Loop

Il ne suffit pas de faire un simple flip pour que la surface soit constamment visible à l'écran ! Vous devez renouveller l'opération aussi longtemps que votre programme s'executera. On va donc utiliser une boucle Do-Loop pour maintenir l'affichage de la surface sur l'écran.

Pour cela, déclarons une variable bRunning qui servira de temoin afin de savoir si le programme s'execute ou pas.

Public bRunning As Boolean

On crée par la suite une boucle Do-Loop qui est contenue dans la procédure Sub Main() du programme.

'Si il y a une erreur (sûrement la surface primaire
'perdue), alors on continue.
On Error Resume Next
Do

'On remplit le Backbuffer avec du blanc
  Backbuffer.BltColorFill ddRect(0, 0, 0, 0), QBColor(14)
'on y met la surface Surface
  Backbuffer.BltFast 0, 0, Surface, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT
  'On flip la surface Primaire sur l'écran
  Primary.Flip Nothing, DDFLIP_WAIT
  'Si malheuresement elle est perdue, on la
  'restaure
  If Err.Number = DDERR_SURFACELOST Then
    Primary.restore
  End If
  'On donne la possibilité au joueur de presser
  'des boutons
  DoEvents
  'On recommence jusqu'à ce que bRunning = False
Loop Until bRunning = False

'On Quitte...
UnloadDD

Cette boucle s'executera aussi longtemps que la variable bRunning sera True. Vous avez donc compris qu'il faut créer une procédure qui pourra mettre bRunning à False.

Quitting...

Si le joueur trouve que votre jeu est trop laid (ce qui sera loin d'être le cas :^) ou si pour une raison quelconque il veut quitter le jeu, offrez lui la possibilité de presser la touche [Escape] pour le faire.

On va donc créer une procédure dans notre feuille Form1 (crée précédement au Premier Chapitre). Lorsque le joueur presse sur la touche [Escape] (de code ANSI 27), on met la variable bRunning à False. Et de retour vers la boucle Do-Loop, celle-ci sera quittée et la procédure UnloadDD sera appelée.

Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 27 Then UnloadDD
End Sub

Il ne nous reste plus qu'à créer la procédure UnloadDD pour décharger toutes les variables DirectX.

Il est préférable d'appeler UnloadDD au lieu d'appeler directement End pour éviter de perdre de la mémoire.

Public Sub UnloadDD()
'On met bien bRunning à False
'Par prudence
bRunning = False
'On restaure le mode d'affichage
DD.RestoreDisplayMode
'On vide tout ! Mais attention il faut respecter
'cet ordre
Set Primary = Nothing
Set Backbuffer = Nothing
Set DD = Nothing
Set DX = Nothing

'Fin
End
End Sub

C'est tout! Pas trop compliqué qu'en même ;^)

Conclusion

Bien vous venez de découvrir comment débuter un programme en mode plein écran et comment y afficher une image.
Le mode fenêtré est similaire à la seule différence qu'on introduit la notion de clippers. On n'aura donc pas besoin dans le prochain chapitre de reprendre integralement tout ce que nous venons de faire.

Téléchargement

Vous pouvez télécharger le projet exemple de cet article:

Ce projet affiche une image sur l'écran en mode plein écran.

[Home] lienie.gif (941 octets)[Actualités]  [Trucs & Astuces] [Astuces Windows] [ActiveX-Ocx/Dll] [Articles] [Codes Sources] [VB Games] [Fichiers Sons] [Fichiers Icônes] [Programmes & Sources]  mailing.gif (910 octets)[Mailing-List] smiley.gif (359 octets)[Divers] about.gif (920 octets)[A Propos]