Fullscreen mit DirectX 9



  • Hallo,
    ich möchte ein Fullscreen-Spiel mit DX-9 programmieren. 🙂
    Das Problem ist, das ich nur ein Buch (Spieleprogr. mit DirectX und C++, Ulrich Kaiser & Phillip Lensing) habe, in dem nur Spiele im Fenstermodus erklärt werden. 😞
    Im Internet habe ich nur Siten gefunden, die vorherige Versionen von DX oder eben Fenster behandeln. Irgendwie soll das ja mit der Funktion CreateFullScreenDisplay() gehen, aber wie? 😕

    Mein Versuch

    # include <windows.h>
    # include <ddraw.h>
    # include <dsound.h>
    # include "ddutil.h"
    # include "dsutil.h"
    
    const int bruttobreite = GetSystemMetrics( SM_CYSCREEN);     
    const int bruttohoehe = GetSystemMetrics( SM_CXSCREEN);      
    
    HINSTANCE instance;    
    HWND window;
    
    class display
    {
    	private:
    		CDisplay c_display; 
    		CSurface *c_hintergrund;
    
    	public:
    		display();
    		void free_all();
    		~display() {free_all();}
    		HRESULT init( HWND wnd);
            void hintergrund() { c_display.Blt( 0, 0, c_hintergrund);}
    		void update(){ c_display.UpdateBounds();}
    		HRESULT cooperative(){return c_display.GetDirectDraw()->TestCooperativeLevel();}
    		HRESULT restore();
    		HRESULT present();
    };
    
    display::display()
    {
    	c_hintergrund = 0;
    }
    
    void display::free_all()
    {
        if( c_hintergrund)
    		delete c_hintergrund;
    
    }
    
    HRESULT display::init( HWND wnd)
    {
    	HRESULT hr;
    
        hr = c_display.CreateFullScreenDisplay( wnd, bruttobreite, bruttohoehe, 16);
    	if( hr < 0)
    		return hr;
    	hr = c_display.CreateSurfaceFromBitmap( &c_hintergrund, "hintergrund.bmp", bruttobreite, bruttohoehe);
    	if( hr < 0)
    		return hr;
    
        return S_OK;
    }
    
    HRESULT display::restore()
    {
        HRESULT hr;
    
        hr = c_display.GetDirectDraw()->RestoreAllSurfaces();
    	if( hr < 0)
    		return hr;
        hr = c_hintergrund->DrawBitmap( "hintergrund.bmp", bruttobreite, bruttohoehe);
    	if( hr < 0)
    		return hr;
    
        return S_OK;
    
    }
    
    HRESULT display::present()
    {
    	HRESULT hr;
    
    	hr = c_display.Present();
    	if( hr == DDERR_SURFACELOST )
    		return restore();
    	return hr; 
    }
    
    display spiel_display;
    
    LRESULT CALLBACK windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    		case WM_DESTROY:
    			PostQuitMessage( 0);
    			return 0;
    	}
    }
    
    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
    {
        MSG msg;
        WNDCLASSEX wcx;	
    
    	instance = hInst;
    
        wcx.cbSize        = sizeof( wcx);
        wcx.lpszClassName = TEXT( "Spiel");
        wcx.lpfnWndProc   = windowhandler;
        wcx.style         = CS_VREDRAW | CS_HREDRAW;
        wcx.hInstance     = hInst;
        wcx.hIcon         = 0;
        wcx.hIconSm       = 0;
        wcx.hCursor       = 0;
        wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcx.lpszMenuName  = 0;
        wcx.cbClsExtra    = 0;
        wcx.cbWndExtra    = 0;
    
        if( !RegisterClassEx( &wcx))
            return 0;
    
        window = CreateWindowEx( 0, TEXT( "Spiel"), TEXT( "Spiel"), WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, 
    		                                          bruttobreite, bruttohoehe, NULL, NULL, hInst, NULL);
        if( !window)
        	return 0;
    
        if( spiel_display.init( window) < 0)
    		{
    	    MessageBox( window, "Fehler beim Initialisieren der Grafik", "Fehlermeldung", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
    		return 0;
    		}
    
        ShowWindow( window, nCmdShow);
    
        while( TRUE)
    	{
            if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE))
    		{
    			if( msg.message == WM_QUIT )
                    return 0;
                TranslateMessage( &msg); 
                DispatchMessage( &msg);
    		}
    
    		else
    		{
                        //...
    		}
    	}
    }
    

    schlug mit (18) Fehlermeldungen vom Typ LNK2019 fehl:

    error LNK2019: Verweis auf nicht aufgelöstes externes 
    Symbol "_DirectDrawCreateEx@16" in Funktion ""public: long __thiscall 
    CDisplay::CreateFullScreenDisplay(struct HWND__ *,unsigned long,unsigned 
    long,unsigned long)" (?CreateFullScreenDisplay@CDisplay@@QAEJPAUHWND__@@KKK@Z)".	ddutil.obj
    

    Kann mir jemand helfen 😕



  • Hallo,

    welche IDE verwendest du? DX LIBs mit ins Projekt eingebunden? DX-SDK vollständig installiert?

    ➡ Nebenbei: DDraw verwendet man eigentlich nicht mehr. Simple 2D Grafik ist auch mit D3D möglich.

    Gruß
    Markus



  • Also, ich arbeite mit Visual C++ 2005 Express und DX ist vollständig installiert. Ein einfaches "Fenstergame" hab ich schon programmiert. 😃
    Das DDraw nicht mehr benutzt wird, ist mir neu. Wie würde denn ein (2D-)Beispiel mit D3D aussehen?? 😕
    (Kann ich mir im Moment nicht vorstellen!)

    thx,
    XCoder++



  • Zum Thema 2D mit 3D einfach mal googeln z.B:
    http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0308.shtml (VB)
    http://www.gamedev.net/reference/articles/article1972.asp (C++, englisch)

    das nicht aufgelöste externe Symbol deutet doch eigentlich darauf hin, dass eine Biliothek nicht mit ins Prjekt eingebunden wurde.

    Gruß
    Markus



  • Danke für die Hilfe!

    mfg


Anmelden zum Antworten