DirectDraw wrappen



  • moin

    also ich wollte mir mal ne klasse basteln, die mir directdraw für den vollbildmodus initialisiert und nach ableben wieder freigibt. dies ist mir so schon gelungen, nur erzeugt die klasse mit dem selben code, der standalone schon funktioniert hat, seltsames verhalten. und zwar hängt sich der rechner total auf und das programm lässt sich nur noch per task-manager abschießen (immerhin xD ).

    also es funktioniert im prinzip alles einwandfrei: DirectDraw-Objekt erzeugen, Surfaces (primary und backbuffer) erzeugen, GrafikModus setzen. Nun will ich aber auch einen Clipper erzeugen und an den BackBuffer anhängen. erzeugen lässt er sich, aber sobald ich BackBuffer->SetClipper(...) aufrufe ist sense. ich komme nicht sorecht dahinter was hier schiefläuft, da ich nicht debuggen kann, weil sich der rechner, wie gesagt, aufhängt. zudem verwundert es mich, da ich den code aus einem funktionierenden programm herauskopiert habe, so wie die anderen teile des konstruktors (die auch wunderbar funzen). ich raff einfach nicht, wieso der code alleine funktioniert, aber in eine klasse gewrapped nicht mehr. wahrscheinlich hab ich wieder was supersimples übersehen, aber das ist wohl eine übliche noobkrankheit 😞

    hier mal auszugsweise der code:

    // Die Klasse
    class CDDEngine
    {
    private:
    	LPDIRECTDRAW7 lpDirectDraw;
    	LPDIRECTDRAWSURFACE7 lpddsPrimary;
    	LPDIRECTDRAWSURFACE7 lpddsBack;
    	LPDIRECTDRAWCLIPPER lpddClipper;
    	HRESULT ddRetVal;
    	GFXMODE GfxMode;
    	RECT screen;
    public:
    	CDDEngine(HWND hWnd, GFXMODE GfxMode);
    	~CDDEngine(void);
    	void Flip();
    };
    

    und hier der code, der stress macht:

    CDDEngine::CDDEngine(HWND hWnd, GFXMODE gm)
    {
        // DirectDraw erzeugen, Surfaces erzeugen... funktioniert
        /* ... */
    
        // Clipper erstellen
    	if (lpDirectDraw->CreateClipper(0, &lpddClipper, NULL) != DD_OK)
    	{
    		CDDEngine::~CDDEngine();
    		return;
    	}
    
    	struct {
    		RGNDATAHEADER rdh;
    		RECT rgnData[1];
    	} cliplist;
    
    	// Clipper konfigurieren:
    	cliplist.rdh.dwSize = sizeof(RGNDATAHEADER);
    	cliplist.rdh.iType = RDH_RECTANGLES;
    	cliplist.rdh.nCount = 1;
    	cliplist.rdh.nRgnSize = 0;
    	cliplist.rdh.rcBound.top = 0;
    	cliplist.rdh.rcBound.left = 0;
    	cliplist.rdh.rcBound.right = GfxMode.resX;
    	cliplist.rdh.rcBound.bottom = GfxMode.resY;
    	cliplist.rgnData[0].left = 0;
    	cliplist.rgnData[0].top = 0;
    	cliplist.rgnData[0].right = GfxMode.resX;
    	cliplist.rgnData[0].bottom = GfxMode.resY;
    
    	// cliplist an den Clipper überreichen
    	if (lpddClipper->SetClipList((LPRGNDATA)&cliplist, 0) != DD_OK)
    	{
    		CDDEngine::~CDDEngine();
    		return;
    	}
    
    	// Den Clipper an den BackBuffer anhängen
    	if (lpddsBack->SetClipper(lpddClipper) != DD_OK); // Diese Zeile macht Stress. Wenn auskommentiert läuft alles soweit
    	{
    		CDDEngine::~CDDEngine();
    		return;
    	}
    }
    

    hat jemand eine idee, warum sich der clipper auf diese weise in "normalem" code erzeugen lässt, aber nicht im konstruktor dieser klasse? ich habe echt einfach nur den code aus meinem funktionierendem programm rüberkopiert und auf einmal gehts nicht mehr. das ist gemein *heul*

    wenn mir wer helfen würde wäre das echt toll.

    gruß und danke



  • so, habs nu rausgefunden. vielleicht interresierts wen: immer schön strukturen die zur konfiguration von DirectDraw-Objekten verwendet werden mit ZeroMemory initialisieren - dann klappts auch.

    naja, meine strafe hab ich schon. hab den ganzen tag damit verbracht herauszufinden, dass ich einfach zu schusselig bin.

    danke, weitermachen 😛


Anmelden zum Antworten