![]()
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... |
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]
[Actualités]
[Trucs
& Astuces]
[Astuces Windows]
[ActiveX-Ocx/Dll]
[Articles]
[Codes Sources]
[VB
Games]
[Fichiers Sons]
[Fichiers Icônes]
[Programmes & Sources]
[Mailing-List]
[Divers]
[A Propos]