Problem mit DiectX & Animationen



  • Servus

    ich versuche gerade C++ und DirectX zu lernen, und bin dabei auf dieses Tutorial gestoßen:

    DirectX Tutorial Animation

    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, &center, &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 Nusso

    PS : 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.


  • Mod

    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 t 🙂

    hah, 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.


Anmelden zum Antworten