seb2086
Messages postés
96
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
1 février 2010
2 févr. 2007 à 10:39
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.