
seb2086
|
Je te met donc les fichiers Commandes_2D.h et .cpp
/*----------------------------------------------------------------------------------- Nom du fichier : Commandes_2D.h -----------------------------------------------------------------------------------*/ // Permet d'éviter les problémes liés aux include #ifndef _COMMANDES_2D_H #define _COMMANDES_2D_H
/*----------------------------------------------------------------------------------- Fichiers Includes -----------------------------------------------------------------------------------*/ #include <windows.h> #include <ddraw.h> //nécessaire au fonctionnement de DDraw
/*----------------------------------------------------------------------------------- Classe Commandes_2D -----------------------------------------------------------------------------------*/ class Commandes_2D { public :
void Init_DDraw(HWND hwnd) ; void LoadSurface(LPDIRECTDRAWSURFACE7 lpDDS, LPSTR szImage, int larg, int haut) ; void Affichage() ; void Release_DDraw() ;
private :
// Variables utilisées par DDraw HWND hwndfm ; // Identificateur de l'application DDSCAPS2 ddscaps ; // Dtructure de capacités de surface DDSURFACEDESC2 ddsd ; // Description de la surface LPDIRECTDRAW7 lpDD ; // Objet DirectDraw LPDIRECTDRAWSURFACE7 lpDDSPrimary ; // Surface primaire DirectDraw LPDIRECTDRAWSURFACE7 lpDDSBack ; // Backbuffer DirectDraw
// Surfaces offscreen contenant les images bitmaps LPDIRECTDRAWSURFACE7 lpDDSFond ; // Image de fond LPDIRECTDRAWSURFACE7 lpDDSSprites01 ; // Sprite "Ouvrir"
// Résolution de l'écran unsigned int WIDTH ; unsigned int HEIGHT ; unsigned int BITS_PER_PIXELS ; }; #endif
/*----------------------------------------------------------------------------------- Nom du fichier : Commandes_2D.cpp -----------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------- Définitions -----------------------------------------------------------------------------------*/ // Nombre de backbuffers du programme #define BUFFERS 1
// Macro très pratique pour supprimer les objets #define RELEASE(a) if (a != NULL) {a -> Release(), a = NULL ;}
// Macro permettant de creer une surface et chargeant une bitmap dans cette surface #define CREER_SURFACE(a,b,c,d) ddsd.dwWidth = c, ddsd.dwHeight = d, lpDD -> CreateSurface(&ddsd, &a, NULL), LoadSurface(a, b ,0,0) ;
/*----------------------------------------------------------------------------------- Fichiers Includes -----------------------------------------------------------------------------------*/ #include "Commandes_2d.h"
/*----------------------------------------------------------------------------------- Nom : Init_DDraw() Description : Initialise les objets DDraw -----------------------------------------------------------------------------------*/ void Commandes_2D :: Init_DDraw(HWND hwnd) { // Résolution de l'écran WIDTH = 1024 ; HEIGHT = 768 ; BITS_PER_PIXELS = 32 ;
// Variables utilisées par DDraw lpDDSPrimary = NULL ; lpDDSBack = NULL ; lpDDSFond = NULL ; lpDDSSprites01 = NULL ;
// Identificateur de l'application hwndfm = hwnd ;
// Création de l'objet DirectDraw DirectDrawCreateEx(NULL, (void**)&lpDD, IID_IDirectDraw7, NULL) ;
// On demande le mode exclusif (priorité au niveau de Windows) lpDD -> SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN |DDSCL_ALLOWREBOOT) ;
// Définition du mode vidéo lpDD -> SetDisplayMode(WIDTH, HEIGHT, BITS_PER_PIXELS, 0, 0) ;
// Création de la surface primaire associée à un backbuffer memset (&ddsd, 0, sizeof (DDSURFACEDESC2)) ; // Initialisation de la structure ddsd.dwSize = sizeof( DDSURFACEDESC2 ) ; ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT ; // On associe un backbuffer à la surface
// Les flags suivants décrivent la surface comme étant primaire, // associée à un backbuffer, et chargée en mémoire vidéo ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY ; ddsd.dwBackBufferCount = BUFFERS ; // Nombre de buffers associés à la surface lpDD -> CreateSurface(&ddsd,&lpDDSPrimary,NULL) ;
// On crée un pointeur vers le back buffer pour permettre le flipping des deux surfaces ZeroMemory(&ddscaps, sizeof(ddscaps)); // Initialisation de la structure ddscaps.dwCaps = DDSCAPS_BACKBUFFER; lpDDSPrimary -> GetAttachedSurface(&ddscaps,&lpDDSBack) ;
// Sélection du noir comme clé de couleur transparente ddsd.ddckCKSrcBlt.dwColorSpaceLowValue = 0 ; ddsd.ddckCKSrcBlt.dwColorSpaceHighValue = 0 ;
//Description des surfaces offscreen de l'exemple //Il n'est pas utile de répéter ces opération pour chaque surface car //la description ddsd ne s'efface pas entre deux création de surface memset(&ddsd, 0, sizeof(DDSURFACEDESC2)) ; //initialisation de la structure ddsd.dwSize = sizeof(DDSURFACEDESC2) ;
// Description de la surface, notamment pour la clé de couleur associée (DDSD_CKSRCBLT) ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_CKSRCBLT ; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
// Création des différentes surfaces (cf macro CREER_SURFACE en début de fichier) CREER_SURFACE(lpDDSFond, "Images\\Menu Démarrage\\Menu_ Demarrage.bmp", 640, 480) ; CREER_SURFACE(lpDDSSprites01, "Images\\Menu Démarrage\\MD_Jouer.bmp", 136, 37) ; }
/*----------------------------------------------------------------------------------- Nom : LoadSurface() Description : Charge un bitmap dans une surface -----------------------------------------------------------------------------------*/ void Commandes_2D :: LoadSurface(LPDIRECTDRAWSURFACE7 lpDDS, LPSTR szImage, int larg, int haut) { HBITMAP hbm ; // Objet bitmap HDC hdcImage = NULL ; // Identificateur de l'image HDC hdcSurf = NULL ; // Identificateur de la surface associée BOOL bReturn = FALSE ;
// Initialisation de la structure ZeroMemory(&ddsd,sizeof(ddsd)) ; ddsd.dwSize = sizeof(ddsd) ;
// On demande la description de la surface if(FAILED(lpDDS->GetSurfaceDesc(&ddsd))) goto Exit ;
// Chargement de l'image dans un HBITMAP. if(larg == 0 && haut == 0) { hbm = (HBITMAP)LoadImage( NULL, szImage, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION |LR_DEFAULTSIZE) ; }
else { hbm = (HBITMAP)LoadImage( NULL, szImage, IMAGE_BITMAP, larg, haut, LR_LOADFROMFILE | LR_CREATEDIBSECTION) ; }
// On sélectionne l'image à associer à la surface hdcImage = CreateCompatibleDC(NULL) ; SelectObject(hdcImage, hbm) ;
// Obtient un DC pour la surface lpDDS -> GetDC(&hdcSurf) ;
//Chargement final dans la surface avec conversion de format si nécessaire BitBlt(hdcSurf, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, 0, 0, SRCCOPY) ;
Exit :
// On supprime les objets créés if(hdcSurf) lpDDS -> ReleaseDC(hdcSurf) ; if(hdcImage) DeleteDC(hdcImage) ; if(hbm) DeleteObject(hbm) ; }
/*----------------------------------------------------------------------------------- Nom : Affichage( Description : Affiche les Sprites -----------------------------------------------------------------------------------*/ void Commandes_2D :: Affichage() { // Affichage du fond (des rectangles NULL indiquent que l'on prend toute la surface) lpDDSBack -> Blt(NULL, lpDDSFond, NULL, DDBLT_WAIT, NULL) ;
// Flipping de la surface primaire avec le BackBuffer lpDDSPrimary -> Flip(NULL, DDFLIP_WAIT) ; }
/*----------------------------------------------------------------------------------- Nom : Release_DDraw() Description : Supprime les surfaces et l'objetDDraw -----------------------------------------------------------------------------------*/ void Commandes_2D :: Release_DDraw() { // Suppression des objets dans l'ordre inverse dans lequel ils ont été créés if(lpDD != NULL) { if(lpDDSPrimary != NULL) { RELEASE(lpDDSSprites01) ; RELEASE(lpDDSFond) ; RELEASE(lpDDSBack) ; RELEASE(lpDDSPrimary) ; }
lpDD -> Release() ; lpDD = NULL ; } }
Dis moi si il te faut autre chose. Merci.
|