读书人

DirectX 3D图形与动画程序设计第104-1

发布时间: 2012-02-28 13:06:34 作者: rapoo

DirectX 3D图形与动画程序设计第104-108页错误
那段代码无法正确执行,还有一个全局变量定义后一直没用
程序执行后无法实现书中的效果!~
D3DRECT g_ClentRect;这个变量一直未使用 ,全部代码如下

C/C++ code
#include<d3dx9.h>#pragma comment(lib,"d3dx9.lib")#pragma comment(lib,"winmm.lib")LPDIRECT3D9            g_pD3D            =NULL;LPDIRECT3DDEVICE9    g_pd3dDevice    =NULL;LPDIRECT3DVERTEXBUFFER9        g_pVB    =NULL;HWND                g_Wnd            =NULL;D3DRECT                g_ClentRect;#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ)|(D3DFVF_DIFFUSE)//书上的代码不正确,编译不过,//--------------------------------------// Desc:顶点结构//--------------------------------------struct CUSTOMVERTEX{    D3DXVECTOR3 position;    DWORD color;};//--------------------------------------// Desc:设置世界矩阵//--------------------------------------VOID SetupWorldMatrice(){    //建立一个绕X轴动态旋转的世界矩阵    D3DXMATRIX matWorld;    UINT iTime = timeGetTime() % 1000;    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;    D3DXMatrixIdentity(&matWorld);    D3DXMatrixRotationX(&matWorld,fAngle);    //设置世界矩阵    g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);}//--------------------------------------// Desc:设置观察矩阵和投影矩阵//--------------------------------------VOID SetupViewandProjMatrices(){    //建立并设置观察矩阵    D3DXVECTOR3 vEyePt(0.0f,3.0f,-5.0f);    D3DXVECTOR3 vLookatPt(0.0f,0.0f,0.0f);    D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);    D3DXMATRIX matView;    D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);    g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);    //建立并设置投影矩阵    D3DXMATRIX matProj;    D3DXMatrixPerspectiveFovLH(&matView,D3DX_PI/4,1.0f,1.0f,100.0f);    g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);}//--------------------------------------// Desc:设置视区//--------------------------------------VOID SetupViewPort(){    RECT rect;    GetClientRect(g_Wnd,&rect);    D3DVIEWPORT9 vp;    vp.X        =0;    vp.Y        =0;    vp.Width    =rect.right;    vp.Height    =rect.bottom;    vp.MinZ        =0.0f;    vp.MaxZ        =1.0f;    g_pd3dDevice->SetViewport(&vp);}//--------------------------------------// Desc:初始化Direct3D//--------------------------------------HRESULT InitD3D(HWND hWnd){    if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))        return E_FAIL;    D3DPRESENT_PARAMETERS d3dpp;    ZeroMemory(&d3dpp,sizeof(d3dpp));    d3dpp.Windowed=TRUE;    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;    d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,//D3DDEVTYPE_HAL创建失败!硬件不支持!                                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,                                    &d3dpp,&g_pd3dDevice)))    {        return E_FAIL;    }        //设置剔除模式为不剔除任何表面(正面和反面)    g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);    //关闭光照处理,默认情况下启用光照处理    g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);        //设置观察和投影矩阵    SetupViewandProjMatrices();        //设置视区    SetupViewPort();    return S_OK;}//--------------------------------------// Desc:创建场景图形//--------------------------------------HRESULT InitGeometry(){    //创建顶点缓冲区    if(FAILED(g_pd3dDevice->CreateVertexBuffer(50*2*sizeof(CUSTOMVERTEX),                                                0,D3DFVF_CUSTOMVERTEX,                                                D3DPOOL_DEFAULT,&g_pVB,NULL)))    {        return E_FAIL;    }    //填充顶点缓冲区    CUSTOMVERTEX* pVertices;    if(FAILED(g_pVB->Lock(0,0,(void**)&pVertices,0)))        return E_FAIL;    for(DWORD i=0;i<50;i++)    {        FLOAT theta = (2*D3DX_PI * i)/(50-1);        pVertices[2*i+0].position = D3DXVECTOR3(sinf(theta),-1.0f,cosf(theta));        pVertices[2*i+0].color= 0xffffff00;        pVertices[2*i+1].position = D3DXVECTOR3(sinf(theta),1.0f,cosf(theta));        pVertices[2*i+1].color=0xffffff00;    }    g_pVB->Unlock();    return S_OK;}//--------------------------------------// Desc:释放对象资源//--------------------------------------VOID Cleanup(){    if(g_pVB != NULL)        g_pVB->Release();    if(g_pd3dDevice != NULL)        g_pd3dDevice->Release();    if(g_pD3D != NULL)        g_pD3D->Release();}//--------------------------------------// Desc:渲染图形//--------------------------------------VOID Render(){    g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);    if(SUCCEEDED(g_pd3dDevice->BeginScene()))    {        SetupWorldMatrice();        //在后台缓冲区绘制图形        g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));        g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);        g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2*50-2);        //结束在后台缓冲区绘制图形        g_pd3dDevice->EndScene();    }    g_pd3dDevice->Present(NULL,NULL,NULL,NULL);}//--------------------------------------// Desc:消息处理//--------------------------------------LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){    switch(msg)    {    case WM_DESTROY:        Cleanup();        PostQuitMessage(0);        return 0;    case WM_KEYDOWN:        switch(wParam)        {        case VK_ESCAPE:            Cleanup();            PostQuitMessage(0);            break;        }    }    return DefWindowProc(hWnd,msg,wParam,lParam);}//--------------------------------------// Desc:程序入口//--------------------------------------INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT){    WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,                    GetModuleHandle(NULL),NULL,NULL,NULL,NULL,                    L"DxPro",NULL};    RegisterClassEx(&wc);    HWND hWnd = CreateWindow(L"DxPro",L"DxPro",                            WS_OVERLAPPEDWINDOW,200,100,500,500,                            GetDesktopWindow(),NULL,wc.hInstance,NULL);    g_Wnd = hWnd;    if(SUCCEEDED(InitD3D(hWnd)))    {        if(SUCCEEDED(InitGeometry()))        {            ShowWindow(hWnd,SW_SHOWDEFAULT);            UpdateWindow(hWnd);            MSG msg;            ZeroMemory(&msg,sizeof(msg));            while(msg.message != WM_QUIT)            {                if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))                {                    TranslateMessage(&msg);                    DispatchMessage(&msg);                }                else                {                    Render();                }            }        }    }    UnregisterClass(L"ClassName",wc.hInstance);    return 0;} 



[解决办法]
你的机子上面能够执行吗,我这里编译有问题了:是宽字符的使用报错,还有就是不能够执行,无法解析的外部命令什么的,dx9老早就装了啊...
Sorry...

[解决办法]
C/C++ code
#include <iostream> // 不是必须#include <windows.h>#include <d3d9.h>#include <mmsystem.h>using namespace std;#pragma comment(lib,"d3d9.lib") 

读书人网 >C++

热点推荐