DirectX9 - Probleme mit dem Fullscreen



  • Ich habe merkwürdiger Weise Probleme mit dem Fullscreen.
    Das Programm funktioniert im Fenstermodus einwandfrei.
    Sobald ich das Programm aber vom Anfang an als Vollbild starte, so bekomme ich ein Error bei:

    D3D_Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(90, 130, 255), 1.0f, 0);
    

    Ich binde mal meine ganzen Codes ein, damit ihr einen Überblick habt und mir gegebenenfalls auch Tipps geben könnt, wie ich es besser machen kann. (Mir fehlt da der Lehrer, der mir sagt wie man es richtig macht)

    #include "engine.h"
    
    DirectX::DirectX(){
    }
    DirectX::~DirectX(){
        D3D_Device->Release();    // close and release the 3D device
        D3D_Device = NULL;
    	if(D3D_Object)
    	{
        D3D_Object->Release();    // close and release Direct3D
    	}
        D3D_Object = NULL;
    }
    bool DirectX::Initialize_D3D(HWND hWnd){
        D3D_Object = Direct3DCreate9(D3D_SDK_VERSION);    // create the Direct3D interface
    
        D3DPRESENT_PARAMETERS d3dpp;    // create a struct to hold various device information
    
        ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use
        d3dpp.Windowed = FALSE;    // program windowed, not fullscreen
        d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;    // set the back buffer format to 32-bit
        d3dpp.BackBufferWidth = engine.WAPI->getwidth();    // set the width of the buffer
        d3dpp.BackBufferHeight = engine.WAPI->getheight();    // set the height of the buffer
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames
        d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D
    
        // create a device class using this information and the info from the d3dpp stuct
    	HRESULT hResult;
    	if(FAILED(hResult = D3D_Object->CreateDevice(D3DADAPTER_DEFAULT,                    
                                                 D3DDEVTYPE_HAL,                        
                                                 hWnd,
                                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING,    
                                                 &d3dpp,
                                                 &D3D_Device)))
        {
            // Fehler beim Generieren der Schnittstelle!
    
        }
    	return true;
    }
    bool DirectX::RenderStart(){
        // clear the window to a deep blue
        D3D_Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(90, 130, 255), 1.0f, 0);
    
        D3D_Device->BeginScene();    // begins the 3D scene
    	return true;
    }
    
    bool DirectX::RenderStop(){
        D3D_Device->EndScene();    // ends the 3D scene
    
        D3D_Device->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen
    	return true;
    }
    
    #ifndef _DIRECTX_H_
    #define _DIRECTX_H_ 1
    
    #include "engine.h"
    
    class DirectX{
    	public:
    		bool Initialize_D3D(HWND hWnd);
    		bool RenderStart();
    		bool RenderStop();
    		DirectX();
    		~DirectX(void);
    		inline LPDIRECT3DDEVICE9 GetDevice(void){ return D3D_Device; }
    	private:
    		LPDIRECT3D9 D3D_Object;
    		LPDIRECT3DDEVICE9 D3D_Device;
    };
    
    #endif
    
    #include "engine.h"
    
    Engine::Engine(){
    	D3DX = new DirectX();
    	WAPI = new WinApi("The World",800,800,"class1");
    }
    Engine::~Engine(){
    }
    
    void Engine::DestroyWindow()
    {
    	D3DX->~DirectX();
    	WAPI->~WinApi();
    }
    
    void Engine::ErrorMessage(LPCSTR text,LPCSTR title)
    {
            MessageBox(NULL, text, title,
                MB_ICONEXCLAMATION | MB_OK);
    }
    
    #ifndef _ENGINE_H
    #define _ENGINE_H 1
    #define DIRECTINPUT_VERSION 0x0800
    #include <iostream>
    #include <windowsx.h>
    #include <d3d9.h>
    #include <d3dx9.h>
    #include "windows.h"
    #include "mainloop.h"
    #include "winapi.h"
    #include "directx.h"
    
    #pragma comment (lib, "d3d9.lib")
    #pragma comment (lib, "d3dx9.lib")
    #pragma comment (lib, "dxguid.lib")
    
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    
    extern void Game_Init();
    extern void Game_Update();
    extern void Game_Render();
    extern void Game_End();
    extern void Game_Messages(UINT message, WPARAM wParam, LPARAM lParam);
    
    using namespace std;
    
    class Engine{
    	public:
    		Engine();
    		~Engine();
    		void DestroyWindow();
    		void ErrorMessage(LPCSTR text,LPCSTR title);
    		int gamestate;
    		DirectX* D3DX;
    		WinApi* WAPI;
    };
    
    extern Engine engine;
    #endif
    
    #include "engine.h"
    
    WinApi::WinApi(LPCSTR tname,int w,int h,LPCSTR cname)
    {
    	title = tname;
    	width = w;
    	height = h;
    	classname = cname;
        if(RegClass() == FALSE){
    		engine.ErrorMessage("Fehler bei der Registrierung des Fensters","ERROR!");
        }
        if(CreateWnd() == FALSE){
    		engine.ErrorMessage("Fehler bei der Erstellung des Fensters","ERROR!");
        }
    }
    
    WinApi::~WinApi(void)
    {
    }
    
    bool WinApi::RegClass(void)
    {
        WNDCLASSEX wc;
    
        ZeroMemory(&wc, sizeof(WNDCLASSEX));
    
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = WndProc;
        wc.hInstance = GetModuleHandle(NULL);
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        // wc.hbrBackground = (HBRUSH)COLOR_WINDOW;    // not needed any more
        wc.lpszClassName = classname;
    
        RegisterClassEx(&wc);
        return TRUE;
    }
    
    bool WinApi::CreateWnd(void){
       /* Wnd = CreateWindowEx( NULL, classname, title,
                             WS_EX_TOPMOST|WS_POPUP|WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_CLIPSIBLINGS|WS_VISIBLE,100, 100, width,
                              height, NULL, NULL, GetModuleHandle(NULL),
                              NULL);*/
          Wnd = CreateWindowEx( NULL, classname, title,
                             WS_EX_TOPMOST|WS_POPUP,0, 0, width,
                              height, NULL, NULL, GetModuleHandle(NULL),
                              NULL);
        if(Wnd==NULL){
            return FALSE;
        }
        return TRUE;
    }
    
    #ifndef _WINAPI_H
    #define _WINAPI_H 1
    
    #include "engine.h"
    
    class WinApi
    {
    	public:
    		WinApi(LPCSTR tname,int w,int h,LPCSTR cname);
    		~WinApi(void);
    		bool InitWindow(void);
    		inline HWND	GetWindowHandle(void){ return Wnd; }
    		inline HINSTANCE GetInstance(void){ return hinstance; }
    		void InstanceSet(HINSTANCE instance){ hinstance = instance; }
    		int getwidth(){return width;}
    		int getheight(){return height;}
    	private:
    		//  Member Variables
    		HINSTANCE hinstance;
    		HICON hMyIcon;
    		HWND Wnd;
    		LPCSTR classname;
    		int width;
    		int height;
    		LPCSTR title;
    		//  Member Functions
    		bool RegClass(void);
    		bool CreateWnd(void);
    };
    
    #endif
    
    #include "engine.h"
    
    //declare global engine object
    Engine engine;
    
    LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
        MSG msg;
    	engine.WAPI->InstanceSet(hInstance);
    	ShowWindow(engine.WAPI->GetWindowHandle(),nCmdShow);
    	engine.D3DX->Initialize_D3D(engine.WAPI->GetWindowHandle());
    	Game_Init();
    
        while(TRUE)
        {
            while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
            if(msg.message == WM_QUIT)
                break;
    
    	Game_Update();
    	engine.D3DX->RenderStart();
    	Game_Render();
    	engine.D3DX->RenderStop();
    
        }
    	Game_End();
    	engine.DestroyWindow();
    	engine.~Engine();
    
    return 0;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
            case WM_DESTROY:
                {
                    PostQuitMessage(0);
                    return 0;
                } break;
    		default:
    			{
    		Game_Messages(message,wParam,lParam);
    			}break;
        }
    
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
    


  • PuRe schrieb:

    ... bekomme ich ein Error ...

    welchen?



  • Um genau zu sein stürzt das Program ab bzw. hört auf an der Stelle zu funktionieren.
    Ebenfalls funktioniert mein Visual Studio dann nicht mehr richtig und ich muss es im task manager beenden.

    Im Fenstermodus funktioniert alles aber einwandfrei.


  • Mod

    start im fenstermodus und klicke strg+alt+entf und geh aus dem menue zurueck zur normalen windows ansicht.
    falls dasselbe passiert wie im fullscreen:
    device lost



  • Dann läuft das Programm immernoch, aber ich kann im Spiel selber nichts mehr klicken. Ich kann es aber normal schließen etc, was ich im Vollbildmodus nicht kann.



  • PuRe schrieb:

    Dann läuft das Programm immernoch, aber ich kann im Spiel selber nichts mehr klicken. Ich kann es aber normal schließen etc, was ich im Vollbildmodus nicht kann.

    du meinst, es bewegt sich noch was?



  • Habe das mal mit TestCooperativeLevel probiert.

    Ergebnis:

    Im Fenstermodus, sofern ich strg + alt + entf drücke, dann kommt der Fehler "Device Lost" (wie erwartet).

    Starte ich das Spiel jedoch im Vollbildmodus, crasht das Programm und Visual Studio sagte mir, dass das Program bei
    D3D_Device->TestCooperativeLevel();
    stoppte.



  • PuRe schrieb:

    Starte ich das Spiel jedoch im Vollbildmodus, crasht das Programm und Visual Studio sagte mir, dass das Program bei
    D3D_Device->TestCooperativeLevel();
    stoppte.

    also ist D3D_Device invalid?



  • Habe das mal weiterverfolgt.

    Der Fehler liegt irgendwo hier:

    bool DirectX::Initialize_D3D(HWND hWnd){
        D3D_Object = Direct3DCreate9(D3D_SDK_VERSION);    // create the Direct3D interface
    
        D3DPRESENT_PARAMETERS d3dpp;    // create a struct to hold various device information
    
        ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use
        d3dpp.Windowed = FALSE;    // program windowed, not fullscreen
        d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;    // set the back buffer format to 32-bit
        d3dpp.BackBufferWidth = engine.WAPI->getwidth();    // set the width of the buffer
        d3dpp.BackBufferHeight = engine.WAPI->getheight();    // set the height of the buffer
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames
        d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D
    
        // create a device class using this information and the info from the d3dpp stuct
        HRESULT hResult;
        if(FAILED(hResult = D3D_Object->CreateDevice(D3DADAPTER_DEFAULT,                    
                                                 D3DDEVTYPE_HAL,                        
                                                 hWnd,
                                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING,    
                                                 &d3dpp,
                                                 &D3D_Device)))
        {
            // FEHLER: D3DERR_INVALIDCALL
    
        }
        return true;
    }
    

    Fehler gefunden!

    Die Höhe und Breite waren nicht richtig definiert!


Anmelden zum Antworten