Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

21.07.2006, 14:39

Windowed bei DDraw?

Ja ich habe schon wieder ein kleines Problemchen. Wie wird normalerweise
ein windowed Modus mit DDraw gesetzt? Ich habe ein normales Fenster
erstellt mit der WinApi und später dann folgendes ausgeführt:

C-/C++-Quelltext

1
if (DDraw7->SetCooperativeLevel (hWnd, DDSCL_NORMAL) != DD_OK)


Nur leider lässt sich danach dann nicht CreateSurface ausführen. Im
Fullscreen Modus läuft alles wunderbar. Vielleicht könnt ihr mir ja kurz helfen.
Ist ja nun kein schwieriges Problem und sollte auch schnell gelöst werden.

Danke!

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

2

21.07.2006, 18:17

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
LPDIRECTDRAW lpdd1;
LPDIRECTDRAW7 lpdd;
LPDIRECTDRAWSURFACE7 lpddsFront;
LPDIRECTDRAWSURFACE7 lpddsBack;
DDSURFACEDESC2 ddsd;
DDSCAPS2 ddscaps;
//

void Create(HWND hWnd,int width,int height,bool windowed)
{
    HRESULT hr;
    //

    hr=DirectDrawCreate(NULL,&lpdd1,NULL);
    if(hr!=DD_OK)
    {
        ExitError("DirectDraw-Object konnte nicht erzeugt werden!");
    }
    hr=lpdd1->QueryInterface(IID_IDirectDraw7,(LPVOID*)&lpdd);
    if(hr!=DD_OK)
    {
        ExitError("DirectDraw7-Schnittstelle konnte nicht abgefragt werden!");
    }
    lpdd1->Release();
    lpdd1=NULL;
    hr=lpdd->SetCooperativeLevel(hWnd,DDSCL_NORMAL);
        if(hr!=DD_OK)
        {
            ExitError("Kooperationslevel konnte nicht gesetzt werden !");
        }
        ZeroMemory(&ddsd,sizeof(ddsd));
        ddsd.dwSize=sizeof(ddsd);
        ddsd.dwFlags=DDSD_CAPS;
        ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY;
        hr=lpdd->CreateSurface(&ddsd,&lpddsFront,NULL);
        if(hr!=DD_OK)
        {
            ExitError("FrontBuffer konnte nicht erzeugt werden!");
        }
        //

        ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
        ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
        ddsd.dwWidth=width;
        ddsd.dwHeight=height;
        hr=lpdd->CreateSurface(&ddsd,&lpddsBack,NULL);
        if(hr!=DD_OK)
        {
            ExitError("BackBuffer konnte nicht erzeugt werden!");
        }
    }

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

3

21.07.2006, 18:18

So in etwa müsste es funktionieren....

Anonymous

unregistriert

4

21.07.2006, 18:25

Arbeitest Du mit Surfaces oder mit linearen Farbarrays? Bei Zweiterem kann sich das etwas "komplizierter" anstellen ;)

Anonymous

unregistriert

5

21.07.2006, 18:31

Mit Surfaces. So wie in Firefly's Beispiel hab ichs ungefähr... Und es sollen ja
Fullscreen und Windowed laufen können... Ich könnte nacher noch ein
Beispiel machen, wie ich es habe...

EDIT: Ist so ähnlich wie bei Funny Break @ nix da ;)

Anonymous

unregistriert

6

21.07.2006, 20:03

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    if (!fullscreen)
    {
            // Hier könnte die Fenstermodusimplementierung rein!

        if (DDraw7->SetCooperativeLevel (hWnd, DDSCL_NORMAL) != DD_OK)
            ERROR (L"Cooperative Level konnte nicht gesetzt werden!");
    }
    else if (fullscreen)
    {
            // Kooperativen Modus festlegen

        if (DDraw7->SetCooperativeLevel (hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) != DD_OK)
            ERROR (L"Cooperative Level konnte nicht gesetzt werden!");

            // Dispaymode setzen

        if (DDraw7->SetDisplayMode (width, height, bpp, 0, 0) != DD_OK)
            ERROR (L"Display Mode konnte nicht gesetzt werden!");
    }

        // Hilfsstrukturen

    ::DDSURFACEDESC2    DDSurfDesc2;
    ::DDSCAPS2          DDscaps2;

        // Strukturen initialisieren

    ::ZeroMemory (&DDSurfDesc2, sizeof(DDSurfDesc2));
    ::ZeroMemory (&DDscaps2,        sizeof(DDscaps2));

        // Parameter setzen und sagen das wir 1 SecondaryBuffer haben

    DDSurfDesc2.dwSize            = sizeof(DDSurfDesc2); 
    DDSurfDesc2.dwFlags           = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; 
    DDSurfDesc2.ddsCaps.dwCaps    = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
    DDSurfDesc2.dwBackBufferCount = 1;

        // PrimarySurface erstellen

    if (DDraw7->CreateSurface (&DDSurfDesc2, &DDscaps2, NULL) != DD_OK)
        ERROR (L"Primary Surface konnte nicht erstellt werden!");


So, das mal als Beispiel, wie ich das habe und bei CreateSurface kommt
halt der Fehler.

Anonymous

unregistriert

7

21.07.2006, 22:52

Frag mal den Rückgabewert von CreateSurface ab. So wie ich das sehe müßte der Invalid Parameter liefern, da es im Fenstermodus keinen Backbuffer gibt 8)

Anonymous

unregistriert

8

21.07.2006, 23:07

Och verdammt, da müsste ich jetzt schon wieder einiges umschreiben -.-
Also wegen blitten, usw, windowed läuft ansonsten... Muss ich mir jetzt
überlegen, ist ja echt bescheuert, dass windowed und fullscreen so
unterschiedlich sind... Danke für die Hilfe!

Anonymous

unregistriert

9

21.07.2006, 23:15

Es ist vom Prinzip her mega einfach!

Wozu direkt auf den Backbuffer blitten? ;)

Ich hab es mir für sowas immer sehr einfach gemacht. Ich habe erstmal einen "Workbuffer" angelegt, je nach Modus (Fenster oder Vollbild) wurde dieser im System oder Videoram angelegt.

Darauf habe ich dann erstmal alles für den Frame gezeichnet. Nachdem ich fertig war, wurd der ganze Inhalt auf den Backbuffer oder direkt auf den Primärpuffer geblittet (Je nach Modus) und gut war ;)

Warum so kompliziert, wenn es einfach ist? :roll:

Anonymous

unregistriert

10

21.07.2006, 23:26

Mh okay, hört sich doch gar nicht so schwer an, wie ich dachte :p die
Fehlermeldungen haben mich nur fast zur Verzweifelung gebracht ;)
Ich werde mich morgen nochmal ransetzen, heute will ich erstmal die
Animationen ordentlich hinbekommen =) (Bin auf einem sehr guten Weg! ;) )

Werbeanzeige