Problem bei einfachem DirectX Programm
-
Ich benutzte das Buch: "Jetzt lerne ich DirectX 9 und Visual C++"
von Markt & Technik.hab es jetzt so gelöst:
hWnd = CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); if (hWnd == NULL) { MessageBox(hWnd,"Fenster konnte nicht erzeugt werden","FEHLER",MB_OK); }
jetzt bekomm ich aber schon wieder diese fehlermeldung:
"DirectX3D.exe": "D:\C++ Dateien\DirectX3D\Debug\DirectX3D.exe" geladen, Symbole wurden geladen. "DirectX3D.exe": "C:\Windows\System32\ntdll.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\kernel32.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\d3d9.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\msvcrt.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\user32.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\gdi32.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\advapi32.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\rpcrt4.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\version.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\d3d8thk.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\dwmapi.dll" wurde geladen "DirectX3D.exe": "C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcr90d.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\imm32.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\msctf.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\lpk.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\usp10.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\uxtheme.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\BtMmHook.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\ole32.dll" wurde geladen "DirectX3D.exe": "C:\Windows\System32\oleaut32.dll" wurde geladen Eine Ausnahme (erste Chance) bei 0x009818c7 in DirectX3D.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000. Unbehandelte Ausnahme bei 0x009818c7 in DirectX3D.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000. Das Programm "[296] DirectX3D.exe: Systemeigen" wurde mit Code -1073741819 (0xc0000005) beendet.
OMG ich glaub ich bin echt ein problemfall oder^^
aber nicht böse sein xDMFG Mr. BigGeLs
-
Benutzt den Debugger und guck wo im Code der Fehler Auftritt. Der Fehler sieht danach aus, dass du auf einen NULL-Pointer zugreifst.
-
den selber fehler hatte ich ja schoneinmal :
der debugger behauptet lpD3DDevice zeigt auf nichts aber als ich den fehler das erstemal hatte lag es daran dass er nur in der winmain deklariert wurde.
aber das habe ich ja schon geändert und ihc weis jetzt nicht an was es diesmal liegt...???
-
Zeig mal den ganzen Code.
-
Ich glaub ich seh den fehler gerade. WindowsProgrammierung ist zwar nicht meine stärke, aber wenn man ein Fenster so erstellt.
CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
Da steht ja nur WS_OVERLAPPEDWINDOW, solange da kein WS_VISIBLE mit da steht bleibt in dem Fall das Fenster nicht unsichbar bis man ne Funktion aufruft? (glaub ShowWindow()?)
-
es liegt ja nicht daran dass das fenster nicht angezeigt wird(wird es nähmlich einen kurzen augenblick), sondern daran, dass der debugger annimmt, lpD3DDevice würde auf nichts zeigen.
@Fusel.Factor Hier nochmal der komplette code:
#include <windows.h> #include <d3d9.h> #include <d3dx9.h> LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM); const char szAppName[] = "DirectX 3D!"; HWND hWnd; LPDIRECT3D9 lpD3D = NULL; LPDIRECT3DDEVICE9 lpD3DDevice = NULL; int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow) { MSG msg; WNDCLASS wc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor (hInstance,IDC_ARROW); wc.hIcon = LoadIcon (hInstance,IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); hWnd = CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); if (hWnd == NULL) { MessageBox(hWnd,"Fenster konnte nicht erzeugt werden","FEHLER",MB_OK); } ShowWindow (hWnd,iCmdShow); UpdateWindow(hWnd); // DirectX 3D initialisieren: lpD3D = Direct3DCreate9(D3D_SDK_VERSION); if(lpD3D == NULL) { return 1; } D3DPRESENT_PARAMETERS PParams; ZeroMemory(&PParams,sizeof(PParams)); PParams.SwapEffect = D3DSWAPEFFECT_DISCARD; PParams.hDeviceWindow = hWnd; PParams.Windowed = TRUE; PParams.BackBufferWidth = 800; PParams.BackBufferHeight= 600; PParams.BackBufferFormat= D3DFMT_A8R8G8B8; if(FAILED(lpD3D ->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &PParams,&lpD3DDevice))) { return 1; } while(GetMessage(&msg,hWnd,0,0)) { TranslateMessage(&msg); DispatchMessage (&msg); } //DirectX 3D "aufräumen": if (lpD3DDevice != NULL) { lpD3DDevice ->Release(); lpD3DDevice = NULL; } if (lpD3D != NULL) { lpD3D ->Release(); lpD3D = NULL; } return 0; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { D3DCOLOR ClearColor = D3DCOLOR_XRGB(27,234,106); switch(message) { case WM_DESTROY: { PostQuitMessage(0); return 0; } case WM_PAINT: { lpD3DDevice ->Clear(0,0,D3DCLEAR_TARGET,ClearColor,0,0); lpD3DDevice ->BeginScene(); lpD3DDevice ->EndScene(); lpD3DDevice ->Present(0,0,0,0); } break; } return DefWindowProc(hWnd,message,wParam,lParam); }
MFG Mr. BigGeLs
-
Ich denke das Problem is Folgendes. In der WndProc benutzt du das lpD3DDevice. Wenn du nun die Funktionen ShowWindow und UpdateWindow aufrufst wird WndProc aufgerufen, woraufhin auf das lpD3DDevice zugegriffen wird, was allerdings noch nicht existiert, da du es erst nacher erstellst. Daher musst du ShowWindow und UpdateWindow erst nacher aufrufen wenn du das lpD3DDevice erstellt hast. Dies ist nur eine Vermutung.
-
SUPPPPPPPPPEEEEEEEEEEEEEEEEEERRRRRRRRRR!!!!!!!!!!!!!!!!!!!!! xD
An dem lag es....hab jetzt ShowWindow() nach CreateDevice() gestellt und es klappt^^ *so glücklich*
VIELEN DANK AN ALLE !!!eine kleine frage die mir gerade eingefalles ist hätt ich noch:
wenn ich jetzt z.b. 2 rechtecke in unterschiedlichen farben darstellen will, muss ich dann 2 zeiger vom typ LPDIRECT3D9 (also 2 zeiger auf das direct-object) erstellen oder 2 zeiger auf ein device (vom typ LPDIRECT3DDEVICE9)??
und die unterschiedlichen farbe bekomm ich indem ich beizeiger ->Clear(0,0,D3DCLEAR_TARGET,hier_eine_andere_farbe,0,0);
setzt??
MFG Mr. BigGeLs
PS: hat einer erfahrungen wie lange es ungefähr dauert um ein simples 3d spiel zu schreiben wenn man gerade angefangen hat directX zu lernen??
mein wunsch ist es ja in der games academy in berlin zu studieren aber die ist so teuer^^
-
Zu DirectX an sich kann ich dir leider nicht weiterhelfen, damit kenne ich mich nicht aus.
Mr. BigGeLs schrieb:
Hat einer erfahrungen wie lange es ungefähr dauert um ein simples 3d spiel zu schreiben wenn man gerade angefangen hat directX zu lernen??
Was heißt simpel? Ich denke mal in 2 - 3 Tagen kannst du Rechtecke darstellen und diese bewegen. Damit wäre dann ein Pong fast fertig geschrieben
-
Mr. BigGeLs schrieb:
eine kleine frage die mir gerade eingefalles ist hätt ich noch:
wenn ich jetzt z.b. 2 rechtecke in unterschiedlichen farben darstellen will, muss ich dann 2 zeiger vom typ LPDIRECT3D9 (also 2 zeiger auf das direct-object) erstellen oder 2 zeiger auf ein device (vom typ LPDIRECT3DDEVICE9)??
und die unterschiedlichen farbe bekomm ich indem ich beizeiger ->Clear(0,0,D3DCLEAR_TARGET,hier_eine_andere_farbe,0,0);
setzt??
Nein, Nein und Nein. LPDIRECT3D ist Quasi nur ein 3D Tor,damit kannst du GeräteCaps auslesen und Direct3D Device erstellen. LPDIRECT3DDEVICE ist eine Oberfläche, öhnlich wien blatt Papier, da wird reingemalt, und zwar alles wenn du 2 Würfel willst malste 2 Würfel ren, wenn du 10 willst malste 10, fertig.
der Clear() Befehl ist dazu da die Oberfläche mit einer Farbe vorzufüllen und einieg andere sachen zu resetten. solange man keine SkyBox benutzt nutzt mand en befehl um das Feld vorzufüllen da sonst das alte Bild im Hintergrund sichtbar bliebe, denn man übermalt das Device ja nur. Am einfachsten ist es wie gesagt wenn du dir das LPDIRECT3DDEVICE wie ein Blatt Papier vorstellst.
Mr. BigGeLs schrieb:
PS: hat einer erfahrungen wie lange es ungefähr dauert um ein simples 3d spiel zu schreiben wenn man gerade angefangen hat directX zu lernen??
mein wunsch ist es ja in der games academy in berlin zu studieren aber die ist so teuer^^Nicht lang, einfache Strukturen gehen sehr schnell, das geht innerhalb weniger Tage hängt aber vom Buch ab. Einfache Objekte wie 3Ecke gehen sehr schnell, länger dauert es erst bei etwas Komplexeren Themen wie Beleuchtung oder Modellen. Hängt also von deienr definition von Simpel ab und auf welche teile von DirectX du in welchem Umpfang zugreifen willst.