Problem mit C++ und DirectX

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit C++ und DirectX

    Hallo, ich bins nach langer Zeit mal wieder^^
    Ich beschäftige mich gerade wieder intensiv mit
    DirectX und bin gerade dabei grundlegende Kenntnisse im
    Bereich DirectX graphics zu erlangen.
    Nun habe ich aber einen sehr unschönen Fehler udn hoffe
    jemand kann mir da helfen^^

    Hier mein momentaner Codeansatz:

    Quellcode

    1. #include "Main_Include.h"
    2. HWND hWnd;
    3. BYTE *Ptr;
    4. IDirect3D9 *gD3DObject;
    5. IDirect3DDevice9 *gD3DDevice;
    6. IDirect3DVertexBuffer9 *pD3DVB;
    7. #define WND_X 500
    8. #define WND_Y 400
    9. #define WND_WIDTH 320
    10. #define WND_HIGTH 240
    11. const char cAppName[] = "DirectX Tutorials";
    12. const char cClassName[] = "mainwindowclass";
    13. const DWORD VertexFVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE);
    14. LRESULT CALLBACK MessageHandler(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    15. HWND CreateMainWindow(HINSTANCE hInstance);
    16. int InitDirect3D();
    17. typedef struct
    18. {
    19. FLOAT x,y,z; //3D-Coordinates
    20. D3DCOLOR diffuse; //Vertexcolor
    21. }MyVertex;
    22. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    23. {
    24. if((hWnd = CreateMainWindow(hInstance)) == NULL)
    25. {
    26. MessageBox(NULL,"Unable to create Main-Window!","Fatal Error",MB_OK | MB_ICONEXCLAMATION);
    27. return 1;
    28. }
    29. if(InitDirect3D() == 0)
    30. {
    31. MessageBox(NULL,"Unable to setup DirectX","DirectX Error",MB_OK | MB_ICONERROR);
    32. return 1;
    33. }
    34. if(FAILED( gD3DDevice->CreateVertexBuffer(sizeof(MyVertex) * 4,
    35. 0 /* Usage */, VertexFVF,D3DPOOL_MANAGED, &pD3DVB,NULL)))
    36. {
    37. MessageBox(NULL,"Unable to vcreate VertexBuffer","DirectX Error",MB_OK | MB_ICONERROR);
    38. return 1;
    39. }
    40. MSG msg;
    41. while(GetMessage(&msg,NULL,0,0))
    42. {
    43. TranslateMessage(&msg);
    44. DispatchMessage(&msg);
    45. }
    46. return 0;
    47. }
    48. HWND CreateMainWindow(HINSTANCE hInstance)
    49. {
    50. WNDCLASSEX wndclex;
    51. wndclex.hInstance = hInstance;
    52. wndclex.lpszClassName = cClassName;
    53. wndclex.lpfnWndProc = MessageHandler;
    54. wndclex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    55. wndclex.cbClsExtra = NULL;
    56. wndclex.cbWndExtra = NULL;
    57. wndclex.hCursor = LoadCursor(NULL,IDC_ARROW);
    58. wndclex.cbSize = sizeof(WNDCLASSEX);
    59. wndclex.hIcon = LoadIcon(hInstance,IDI_WINLOGO);
    60. wndclex.hIconSm = LoadIcon(hInstance,IDI_WINLOGO);
    61. wndclex.style = CS_DBLCLKS | CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
    62. wndclex.lpszMenuName = NULL;
    63. RegisterClassEx(&wndclex);
    64. return CreateWindowEx(NULL,
    65. cClassName,
    66. cAppName,
    67. WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    68. WND_X,
    69. WND_Y,
    70. WND_WIDTH,
    71. WND_HIGTH,
    72. NULL,
    73. NULL,
    74. hInstance,
    75. NULL);
    76. }
    77. LRESULT CALLBACK MessageHandler(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    78. {
    79. switch(msg)
    80. {
    81. case WM_DESTROY:
    82. PostQuitMessage(0);
    83. return 0;
    84. break;
    85. }
    86. return (DefWindowProc(hWnd,msg,wParam,lParam));
    87. }
    88. int InitDirect3D()
    89. {
    90. if(FAILED(gD3DObject = Direct3DCreate9(D3D_SDK_VERSION)))
    91. {
    92. //Error occured
    93. return 0;
    94. }
    95. D3DDISPLAYMODE d3ddm;
    96. d3ddm.Width = 1024;
    97. d3ddm.Height = 768;
    98. d3ddm.RefreshRate = 0; //0 = default
    99. d3ddm.Format = D3DFMT_R5G6B5;
    100. D3DPRESENT_PARAMETERS d3dpp;
    101. d3dpp.Windowed = FALSE;
    102. d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
    103. d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    104. d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
    105. d3dpp.BackBufferFormat = d3ddm.Format;
    106. d3dpp.BackBufferWidth = d3ddm.Width;
    107. d3dpp.BackBufferHeight = d3ddm.Height;
    108. return (gD3DObject->CreateDevice(D3DADAPTER_DEFAULT, //Direct3D Adapter
    109. D3DDEVTYPE_HAL, //Devicetype(Hal)
    110. hWnd, //Handler to the Window
    111. D3DCREATE_SOFTWARE_VERTEXPROCESSING, //behaivor flag
    112. &d3dpp, //D3D Present Paramter
    113. &gD3DDevice));
    114. }
    Alles anzeigen


    Wenn ich das kompiliere bekomme ich keine Fehlermeldung udn auch beim linken gibts keien Probleme.Nur beim testen beschenkt mich Windows mit einer
    netten "Das programm hat einen Fehler festgestellt und muss beendet werden"-Fehlermeldung.

    Daraufhin hab ich das Programm ma debuggt und folgende Fehlermeldung erhalten->

    [Blockierte Grafik: http://skabus.sk.ohost.de/Daten/fehlermeldung.PNG]


    Zusammenhängen tut es anscheinend mit dem D3DDevice, welches
    nicht ausgewertet werden kann->

    [Blockierte Grafik: http://skabus.sk.ohost.de/Daten/fehlermeldung2.PNG]

    Weis jemand wo das Problem liegt oder was ich falsch mache?
    Wäre toll wenn mir jemand helfen würde^^


    Danke im vorraus,

    MfG Ska
    "A Programmer is just a tool which converts cofein into code!"
    (anonymer Verfasser)
    [Blockierte Grafik: http://www.beepworld.de/memberdateien/members98/skabus/sigc.jpg]
  • dein g3DObject kann nicht aufgeloest werden, weil es NULL ist ....
    Also quasi dein schnittstellenzeiger ist ungueltig

    CreateDevice vom gD3DObject liefert dir also keinen gueltigen interface-zeiger.

    das problem ist:

    Quellcode

    1. int InitDirect3D()
    2. {
    3. if(FAILED(gD3DObject = Direct3DCreate9(D3D_SDK_VERSION)))
    4. {
    5. //Error occured
    6. return 0; // <- return springt aus der funktion raus, mit dem rueckgabewert 0, 0 == Success, sollte so also nicht sein, besser wert ungleich 0 zurueckgeben !
    7. }



    also dein Direct3DCreate9 funktioniert schon nicht ....
    warum, keine ahnung

    Noch ne anmerkung:
    die globalen variablen fuer die Device sind boese, verwend lieber uebergabeparameter !


    Ciao ....
  • Danke^^

    Habs schon herausgefunden.Hatte beim setzen der Present Parameter vergessen
    das Fenster anzugeben in welches gerendert werden soll->



    Quellcode

    1. d3dpp.Windowed = FALSE;
    2. d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
    3. d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    4. d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
    5. d3dpp.BackBufferFormat = d3ddm.Format;
    6. d3dpp.hDeviceWindow = hWnd; //diese Zeile hatte ich vergessen
    7. d3dpp.BackBufferWidth = d3ddm.Width;
    8. d3dpp.BackBufferHeight = d3ddm.Height;



    So klappt das Ganze XD

    btw.: Zu den übergabeparameter-> ich weiß, eigentlich macht man das nich,
    aber da es ja nur um grundlagen geht fällt das ncih sonderlich isn gewicht.
    Stimmt aber, danke für den Tipp ^^


    MfG Ska
    "A Programmer is just a tool which converts cofein into code!"
    (anonymer Verfasser)
    [Blockierte Grafik: http://www.beepworld.de/memberdateien/members98/skabus/sigc.jpg]
  • aber da es ja nur um grundlagen geht fällt das ncih sonderlich isn gewicht.

    Mal ganz generell, nicht nur bei der programmierung:
    Schmutzige Dinge soll man auch bei schnutzigen Loesungen ned machen, weil nur dadurch werden sie ja schmutzig ^^
    Oder man soll sich sowas auch gar ned erst angewoehnen, spaeter in der praxis wird einem das wirklich zum verhaengniss. "Ist doch nur fuer ......" ist meist nicht nur fuer :) In der praxis halten schmutzige dinge viel laenger als einem lieb ist :) und saubere Dinge tun soll man ja auch ueben! (gewoehnungseffekt)

    Ich haett Lehrerin werden sollen ... neee lieber doch ned ! :shock:

    Ciao ...