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.
-
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!