Problem mit DiectX & Animationen
-
Servus
ich versuche gerade C++ und DirectX zu lernen, und bin dabei auf dieses Tutorial gestoßen:
ich bin das Tutorial durchgegangen, aber wenn ich jetzt den Code mit VisualC++ compiliere, dann ist bei mir die Animation verzogen und es wird der falsche Bereich von dem Bild angezeigt.
Das Bild für die Animation ( auch von DirectXtutorial.com )
// include the basic windows header files and the Direct3D header file #include <windows.h> #include <windowsx.h> #include <d3d9.h> #include <d3dx9.h> // define the screen resolution and keyboard macros #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) // include the Direct3D Library file #pragma comment (lib, "d3d9.lib") #pragma comment (lib, "d3dx9.lib") // global declarations LPDIRECT3D9 d3d; // the pointer to our Direct3D interface LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class LPD3DXSPRITE d3dspt; // the pointer to our Direct3D Sprite interface // sprite declarations LPDIRECT3DTEXTURE9 sprite; // the pointer to the sprite // function prototypes void initD3D(HWND hWnd); // sets up and initializes Direct3D void render_frame(void); // renders a single frame void cleanD3D(void); // closes Direct3D and releases memory // the WindowProc function prototype LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // the entry point for any Windows program int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd; WNDCLASSEX wc; ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WindowProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = L"WindowClass"; RegisterClassEx(&wc); hWnd = CreateWindowEx(NULL, L"WindowClass", L"Our Direct3D Program", WS_EX_TOPMOST | WS_POPUP, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); // set up and initialize Direct3D initD3D(hWnd); // enter the main loop: MSG msg; while(TRUE) { DWORD starting_point = GetTickCount(); if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } render_frame(); // check the 'escape' key if(KEY_DOWN(VK_ESCAPE)) PostMessage(hWnd, WM_DESTROY, 0, 0); while ((GetTickCount() - starting_point) < 25); } // clean up DirectX and COM cleanD3D(); return msg.wParam; } // this is the main message handler for the program LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_DESTROY: { PostQuitMessage(0); return 0; } break; } return DefWindowProc (hWnd, message, wParam, lParam); } // this function initializes and prepares Direct3D for use void initD3D(HWND hWnd) { d3d = Direct3DCreate9(D3D_SDK_VERSION); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = FALSE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hWnd; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.BackBufferWidth = SCREEN_WIDTH; d3dpp.BackBufferHeight = SCREEN_HEIGHT; // create a device class using this information and the info from the d3dpp stuct d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev); D3DXCreateSprite(d3ddev, &d3dspt); // create the Direct3D Sprite object D3DXCreateTextureFromFileEx(d3ddev, // the device pointer L"Panel3.png", // the file name D3DX_DEFAULT, // default width D3DX_DEFAULT, // default height D3DX_DEFAULT, // no mip mapping NULL, // regular usage D3DFMT_A8R8G8B8, // 32-bit pixels with alpha D3DPOOL_MANAGED, // typical memory handling D3DX_DEFAULT, // no filtering D3DX_DEFAULT, // no mip filtering D3DCOLOR_XRGB(255, 0, 255), // the hot-pink color key NULL, // no image info struct NULL, // not using 256 colors &sprite); // load to sprite return; } // this is the function used to render a single frame void render_frame(void) { // clear the window to a deep blue d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 0, 0), 1.0f, 0); d3ddev->BeginScene(); // begins the 3D scene d3dspt->Begin(D3DXSPRITE_ALPHABLEND); // begin sprite drawing with transparency // DRAW THE SPRITE FRAME // count from 0 to 22 to determine the current frame static int frame = 21; // start the program on the final frame if(KEY_DOWN(VK_SPACE)) frame=0; // when the space key is pressed, start at frame 0 if(frame < 21) frame++; // if we aren't on the last frame, go to the next frame // calculate the x-position int xpos = frame * 182 + 1; // draw the selected frame using the coordinates RECT part; SetRect(&part, xpos, 0, xpos + 181, 128); D3DXVECTOR3 center (0.0f, 0.0f, 0.0f); // center at the upper-left corner D3DXVECTOR3 position(50.0f, 50.0f, 0.0f); // position at 50, 50 with no depth d3dspt->Draw(sprite, &part, ¢er, &position, D3DCOLOR_ARGB(127, 255, 255, 255)); d3dspt->End(); // end sprite drawing d3ddev->EndScene(); // ends the 3D scene d3ddev->Present (NULL, NULL, NULL, NULL); return; } // this is the function that cleans up Direct3D and COM void cleanD3D(void) { sprite->Release (); d3ddev->Release (); d3d->Release (); return; }
Ich poste einfach mal den kompletten Code, da ich überhaupt keine Ahnung habe wo der Fehler liegt.
Ich hoffe jemand kann mir Helfen. Danke schonmal im vorraus.
MfG NussoPS : warum wird "V o r r a u s" zensiert ?
-
Hast du den Code 1:1 übernommen? Hast du irgendwas geändert? Üblicherweise entsteht der Fehler erst beim Leser des Tutorials...
Nusso schrieb:
PS : warum wird "V o r r a u s" zensiert ?
Weil du es falsch schreibst. Voraus ist richtig.
-
hast du den orginal sourcecode vom tutorial verwendet? oder selbst (ab)getippt?
das word v o r r a u s gibt es nicht und deswegen leistet das forum seinen beitrag das zu unterbinden
das gleiche gilt fuer s t a n d a r thah, das war eine sekundenentscheidung
-
der Code ist vom tutorial kopiert.
Ich hatte in erst abgeschrieben, hatte aber den selben Fehler, dann hab ich den Code kopiert in der Hoffnung, dass der Fehler nur im Falsch abschreiben lag.
Dem war leider nicht so^^
-
Weiß niemand eine Lösung für mein Problem.
Bitte, ich verzweifle ... ich suche schon seit 7 Tagen nach einer Lösung.
Bin ich der erste/ einzige der dieses Problem hat ?
MfG Nusso
-
Heda,
also ich habe Deinen Code mal eben kompiliert und es läuft alles so, wie es laufen sollte - zuerst wird das letzte Bild dargestellt, drückt man die Leertaste, läuft die Animation ab.
Welcher Bereich des Bildes wird Dir denn angezeigt?
-
Servus,
das Letzte/erste Bild, das bei mir angezeigt wird, ist ein halbdursichtiger schwarzer Kasten.
Wenn ich die Animation starte sehe ich immer genau 2 Abschnitte des Animationstreifens nebeneinander und die Animation endet dann wieder mit einen halbdurchsichtigen schwarzem Bild.