Anfänger hat Probleme bei Transformationen mit DirectX



  • Bei diesem Programmcode tritt dieses Problem auf!!!!!!!

    Problem: Wie ihr in diesem Video sehen werdet, wird wenn ich das Objekt bewege
    das Objekt an der alten Position nicht mehr gelöscht!!!! http://www.youtube.com/watch?v=8x2KLeiRWPg

    Code:

    #include <windows.h>
    #include <d3dx9.h>
    #include <dinput.h>
    
    HWND main_window_handle = NULL; 
    HINSTANCE hinstance_app = NULL; 
    #define WINDOW_CLASS_NAME "Game Shell Window" 
    #define WIN32_LEAN_AND_MEAN 
    #define T1 "C:\\Users\\Michael\\Pictures\\Car_1.bmp"
    
    LPDIRECT3D9 lp3D = NULL;
    LPDIRECT3DDEVICE9 lp3DDevice = NULL;
    LPDIRECT3DVERTEXBUFFER9 Quad = NULL;
    LPDIRECT3DTEXTURE9 lpTexture = NULL;
    LPDIRECTINPUT8 lpDI = NULL;
    LPDIRECTINPUTDEVICE8 lpKey = NULL;
    
    float TransX;
    float TransY;
    
    #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 
    #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
    
    #define D3D_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
    
    struct CustomVertex
    {
    	float x,y,z;
    	float tu,tv;
    };
    CustomVertex QuadVertices[]=
    {
    	{-1.0f,0.0f,0.0f,0.0f,1.0f},
    	{-1.0f,2.0f,0.0f,0.0f,0.0f},
    	{1.0f,0.0f,0.0f,1.0f,1.0f},
    	{1.0f,0.0f,0.0f,1.0f,1.0f},
    	{-1.0f,2.0f,0.0f,0.0f,0.0f},
    	{1.0f,2.0f,0.0f,1.0f,0.0f},
    };
    
    void Init_3D(); 
    void Init_Szene();
    void Render();
    void Init_Projection();
    void Init_Input();
    void Get_Input();
    
    LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam) 
    { 
    
    PAINTSTRUCT ps; 
    HDC hdc; 
    
    switch(msg) 
    { 
        case WM_CREATE: 
        { 
            return(0); 
        } 
        break; 
    
        case WM_PAINT: 
        { 
            hdc = BeginPaint(hwnd,&ps); 
            EndPaint(hwnd,&ps); 
            return(0); 
        } 
        break; 
    
        case WM_DESTROY: 
        { 
            PostQuitMessage(0); 
            return(0); 
        } 
        break; 
    
        default: 
        break; 
    
    } 
    return (DefWindowProc(hwnd, msg, wparam, lparam)); 
    
    } 
    
    int WINAPI WinMain( HINSTANCE hinstance,HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow) 
    { 
    
    WNDCLASSEX winclass; 
    HWND hwnd; 
    MSG msg; 
    
    winclass.cbSize = sizeof(WNDCLASSEX); 
    winclass.style = CS_HREDRAW | CS_VREDRAW; 
    winclass.lpfnWndProc = WindowProc; 
    winclass.cbClsExtra = 0; 
    winclass.cbWndExtra = 0; 
    winclass.hInstance = hinstance; 
    winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    winclass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 
    winclass.lpszMenuName = NULL; 
    winclass.lpszClassName = WINDOW_CLASS_NAME; 
    winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 
    
    hinstance_app = hinstance; 
    
    if (!RegisterClassEx(&winclass)) 
    return(0); 
    
    if (!(hwnd = CreateWindowEx(NULL,WINDOW_CLASS_NAME,"My Game Shell",WS_POPUP | WS_VISIBLE,0,0,1680,1050,NULL,NULL,hinstance,NULL))) 
        return(0); 
    
    main_window_handle = hwnd; 
    
    Init_Input();
    Init_3D();
    Init_Projection();
    Init_Szene();
    while(TRUE) 
        { 
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
        { 
    
        if (msg.message == WM_QUIT) 
        break; 
    
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
        if(KEYDOWN(VK_ESCAPE)) 
        { 
    
        SendMessage(main_window_handle,WM_CLOSE,0,0);
    
        } 
    
        } 
        Render();
    	Get_Input();
        } 
    
    return(msg.wParam); 
    
    } 
    
    void Init_3D()
    {
    
        lp3D = Direct3DCreate9(D3D_SDK_VERSION); 
        D3DPRESENT_PARAMETERS dpp; 
        ZeroMemory(&dpp,sizeof(dpp)); 
        dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
        dpp.BackBufferCount = 1; 
        dpp.BackBufferWidth = 1680; 
        dpp.BackBufferHeight = 1050; 
        dpp.Windowed = TRUE; 
        dpp.BackBufferFormat = D3DFMT_UNKNOWN;//D3DFMT_X8R8G8B8; 
        dpp.hDeviceWindow = main_window_handle; 
        lp3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,main_window_handle,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&dpp,&lp3DDevice); 
    }
    void Init_Szene()
    {
    	void* VBS;
    	lp3DDevice->CreateVertexBuffer(sizeof(QuadVertices),D3DUSAGE_WRITEONLY,D3D_CUSTOMVERTEX,D3DPOOL_MANAGED,&Quad,NULL);
    	Quad->Lock(0,0,&VBS,0);
    	memcpy(VBS,QuadVertices,sizeof(QuadVertices));
    	Quad->Unlock();
    	D3DXCreateTextureFromFile(lp3DDevice,T1,&lpTexture);
    	lp3DDevice->SetFVF(D3D_CUSTOMVERTEX);
    }
    void Render()
    {
    	D3DXMATRIX matrix;
    	lp3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
    	lp3DDevice->BeginScene();
    	lp3DDevice->SetStreamSource(0,Quad,0,sizeof(CustomVertex));
    	D3DXMatrixTranslation(&matrix,TransX,TransY,0.0f);
    	lp3DDevice->SetTransform(D3DTS_WORLD,&matrix);
    	lp3DDevice->SetTexture(0,lpTexture);
    	lp3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
    	lp3DDevice->EndScene();
    	lp3DDevice->Present(NULL,NULL,NULL,NULL);
    }
    
    void Init_Projection()
    {
    	D3DXMATRIX ViewMatrix;
    
        D3DXMatrixLookAtLH(&ViewMatrix,
                           &D3DXVECTOR3( 0.0f,  0.0f,-10.0f ),
                           &D3DXVECTOR3( 0.0f,  0.0f, 0.0f ),
                           &D3DXVECTOR3( 0.0f,  1.0f, 0.0f ));
    
        lp3DDevice->SetTransform(D3DTS_VIEW,&ViewMatrix);
    
        D3DXMATRIX ProjMatrix;
    
        D3DXMatrixPerspectiveFovLH(&ProjMatrix,
                                   D3DX_PI/4,
                                   1680.0f/ 1050.0f,
                                   0.0f,
                                   100.0f);
    
        lp3DDevice->SetTransform(D3DTS_PROJECTION,&ProjMatrix);
    	lp3DDevice->SetRenderState(D3DRS_LIGHTING,false);
    
    }
    void Init_Input()
    {
       DirectInput8Create(hinstance_app,DIRECTINPUT_VERSION,IID_IDirectInput8,(LPVOID*)&lpDI,NULL);
       lpDI->CreateDevice(GUID_SysKeyboard,&lpKey,NULL);
       lpKey->SetCooperativeLevel(main_window_handle,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE);
       lpKey->SetDataFormat(&c_dfDIKeyboard);
       lpKey->Acquire();
    }
    void Get_Input()
    {
    	bool bKey[256];
    	if(FAILED(lpKey->GetDeviceState(sizeof(bKey),(LPVOID)&bKey)))
    	{
    		lpKey->Acquire();
    	}
        if(bKey[DIK_RIGHT])
    	{
    		TransX = TransX + 0.3f;
    	}
    	if(bKey[DIK_LEFT])
    	{
    		TransX = TransX - 0.3f;
    	}
    }
    

Anmelden zum Antworten