(Spiele-/Gra...) Direct-Draw-Fehler



  • Hallo,

    ich habe folgenden Code:

    #include <ddraw.h>
    #include <windows.h>
    
    LPDIRECTDRAW7 lpdd=0;
    LPDIRECTDRAWSURFACE7 prim=0;
    LPDIRECTDRAWSURFACE7 back=0;
    
    int Reihe=1;
    
    LRESULT CALLBACK WndProc(HWND,unsigned,WPARAM,LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow )
    {
        WNDCLASS wc;
        wc.cbClsExtra=0;
        wc.cbWndExtra=sizeof(DWORD);
        wc.hbrBackground=(HBRUSH) GetStockObject(BLACK_BRUSH);
        wc.hCursor=LoadCursor(0,IDC_ARROW);
        wc.hIcon=0;
        wc.hInstance=hInstance;
        wc.lpfnWndProc= (WNDPROC) WndProc;
        wc.lpszClassName="WinProg";
        wc.lpszMenuName=0;
        wc.style=CS_VREDRAW|CS_HREDRAW;
    
        RegisterClass(&wc);
    
        HWND hWindow;
        hWindow=CreateWindow("WinProg","DXProc",WS_OVERLAPPEDWINDOW,100,100,600,400,0,0,hInstance,0);
    
        ShowWindow(hWindow,nCmdShow);
        UpdateWindow(hWindow);
        ShowCursor(false);
        SetTimer(hWindow,0,1000,0);
        DirectDrawCreateEx(0,(void**)&lpdd,IID_IDirectDraw7,0);
        lpdd->SetCooperativeLevel(hWindow,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
        lpdd->SetDisplayMode(640,480,16,0,0);
        DDSURFACEDESC2 ddsd;
        ZeroMemory(&ddsd,sizeof(ddsd));
        ddsd.dwSize=sizeof(ddsd);
        ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
        ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
        ddsd.dwBackBufferCount=1;
    
        lpdd->CreateSurface(&ddsd,&prim,0);
    
        DDSCAPS2 ddscaps;
        ZeroMemory(&ddscaps,sizeof(ddscaps));
        ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
        prim->GetAttachedSurface(&ddscaps,&back);
    
        MSG msg;
        while(GetMessage(&msg,0,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        back->Release();
        prim->Release();
        lpdd->Release();
        ShowCursor(true);
        return msg.wParam;
    }
    LRESULT CALLBACK WndProc(HWND hWnd,unsigned uiMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(uiMsg)
        {
        case WM_TIMER:
            if(Reihe==1)
            {
                HDC hdc;
                back->GetDC(&hdc);
                TextOut(hdc,10,10,"Primary Buffer",lstrlen("Primary Buffer"));
                back->ReleaseDC(hdc);
                Reihe=2;
            }
            else
            {
                HDC hdc;
                back->GetDC(&hdc);
                TextOut(hdc,10,10,"Back Buffer",lstrlen("Back Buffer"));
                back->ReleaseDC(hdc);
                Reihe=1;
            }
            prim->Flip(0,DDFLIP_WAIT);
            return 0;
        case WM_KEYDOWN:
            DestroyWindow(hWnd);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd,uiMsg,wParam,lParam);
        }
        return 0;
    }
    

    Wenn ich das Programm starte, erscheint zuerst Primary Buffer mit wirrem Zeug am unteren Ende des Bildschirms, danach Back Buffer im Fenster. Wie kann ich das lösen?



  • Ich würde sagen, du solltest diesen Post von nem Admin ins Grafik-/Spieleprogrammierer-Forum verschieben lassen - da sind die Experten für sowas 😉



  • Also ich sehe mehrere potentielle Fehlerquellen:
    1. Du testest nie die Rückgabewerte. Du solltest immer jeden (wirklich jeden) Rückgabewert testen. Sonst kannst du nie sicher sein, ob dein Programm noch fehlerlos läuft.
    2. Du kannst nicht erwarten, dass der Primary Buffer schwarz, blau oder mit dem Logo des c++ Forums gefüllt ist. Im Primary buffer steht halt drin, was eben im video ram steht. 😉
    Du musst den schon manuell einfärben.

    okay, und damit nach "Spieleprogrammierung...". 🙂


Anmelden zum Antworten