DirectX pb avec la surface primaire sans le plein écran
cs_Diabolus
Messages postés61Date d'inscriptionsamedi 20 décembre 2003StatutMembreDernière intervention28 septembre 2007
-
16 févr. 2004 à 20:52
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 2006
-
19 févr. 2004 à 10:38
Salut à tous !
J'ai un problème concernant le mode plein écran de Direct Draw que je veux supprimer.
J'arrive enfin a créer une simple fenêtre (qui n'est pas en plein écran) mais la création de la surface primaire plante et je ne sais pas du tout pourquoi.
La partie qui plante marchait très bien avec le mode plein écran.
DDraw(HINSTANCE hInstance, int nCmdShow){
//Méthode initialisant DirectDraw
WNDCLASS wc; //fenêtre Windows
//Création et déclaration de la classe de la fenêtre.
wc.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = NULL;
wc.lpszMenuName = NAME;
wc.lpszClassName = NAME;
RegisterClass(&wc);
//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_NORMAL |DDSCL_ALLOWREBOOT );
//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 = 1;
//nombre de back 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;
//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;
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 17 févr. 2004 à 00:05
tu ne peut pas spcéfifier fome normal et exclusif en même temps (c'est soit l'un soit l'autre et en mode non plein écran c'est DDSCL_NORMAL)
extrait de la doc :
DDSCL_FULLSCREEN
The exclusive-mode owner is responsible for the entire primary surface. The GDI can be ignored. This flag must be used with the DDSCL_EXCLUSIVE flag.
DDSCL_EXCLUSIVE
Requests the exclusive level. This flag must be used with the DDSCL_FULLSCREEN flag.
DDSCL_NORMAL :
The application functions as a regular Microsoft® Windows® application. This flag cannot be used with the DDSCL_ALLOWMODEX, DDSCL_EXCLUSIVE, or DDSCL_FULLSCREEN flags.
Je pense que cette ligne va créer mon backbuffer sur lequel je vais appliquer mes sprites, donc c'est une étape obligatoire.
Je ne vois pas pourquoi ça marche en plein écran et pas en fenêtre ?
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 19 févr. 2004 à 10:38
les chaînes de backbuffer ne sont possible qu'en mode plein écran. en mode fenêtré, tu doit gérer toi-même les buffers offscreen. (en faisant une copie par bitblt à l'écran)
va voir ma source d'écran de veille matrix il y a un exemple qui gère les 2 (plein écran et fenétré)