|
|
我的代码是控制一部飞机移动和开枪的,但是不知道为什么执行不了,请高手指点一下,我不知道那里错了
#include<d3d9.h>
#include<d3dx9.h>
LPDIRECT3D9 g_pD3D = NULL; //D3D对象
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //D3D设备对象
D3DMATERIAL9 *g_cz = NULL; //材质
LPDIRECT3DTEXTURE9 *g_wenli = NULL; //纹理
//ID3DXBuffer *g_czhc; //材质缓冲
ID3DXBuffer *g_mhcq;
ID3DXMesh *mesh1 = NULL; //模型对象
ID3DXMesh *mesh2 = NULL;
DWORD czzs; //材质总数
BYTE m_bKey[256];
D3DXMATRIX sys,zidan[20]; //飞机矩阵,子弹矩阵
float fu[2];
int zidanbz[20]; //子弹标志,0=无,1=有
int i,j,k,e,l;
DWORD ttt,t;
VOID Inputresponse() //设置反应
{
if(m_bKey['A'])
{
sys._41 += fu[0];
}
if(m_bKey['D'])
{
sys._41 -= fu[0];
}
if(m_bKey['W'])
{
sys._42 += fu[0];
}
if(m_bKey['S'])
{
sys._42 += fu[0];
}
if(m_bKey['J'])
{
for(i=0;i<20;i++)
{
if(zidanbz==0)
{
zidan=sys,zidanbz=1;
}
}
}
}
VOID SetViewAndProjMatrix() //设置观察矩阵和投影矩阵
{
D3DXMatrixTranslation(&sys,0.0f,0.0f,-50.0f);
g_pd3dDevice->SetTransform(D3DTS_WORLD,&sys);
D3DXVECTOR3 vEyePt(0.0f,100.0f,100.0f);
D3DXVECTOR3 vLookatPt(0.0f,0.0f,-100.0f);
D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI * 0.25f,1,1.0f,500.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
fu[0]=2.0f;
fu[1]=3.0f;
}
HRESULT InitD3D(HWND hWnd)
{
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferHeight=800; //后备缓冲区高度
d3dpp.BackBufferWidth=600; //后备缓冲区宽度
d3dpp.BackBufferCount=1; // 后备缓冲区表面数量,设为1,表示只有一个后备表面
d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8; //后备缓冲表面的像素格式
d3dpp.Windowed = TRUE; //true为窗口模式,false为全屏
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; //设置交换链如何被交换的,设置D3DSWAEFFECT_DISCARD是最有效的
d3dpp.EnableAutoDepthStencil=TRUE; //自动创建深度/模板缓冲
d3dpp.AutoDepthStencilFormat=D3DFMT_D16; //深度/模板缓冲格式
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
{
return E_FAIL;
}
SetViewAndProjMatrix();
ZeroMemory(m_bKey,256);
return S_OK;
}
HRESULT InitGeometry()
{
ID3DXBuffer *g_czhc;
D3DXLoadMeshFromXA("airplane.x",D3DXMESH_MANAGED,g_pd3dDevice,&g_mhcq,&g_czhc,0,&czzs,&mesh1); //加载网格模型
D3DXLoadMeshFromXA("ball",D3DXMESH_MANAGED,g_pd3dDevice,&g_mhcq,&g_czhc,0,&czzs,&mesh2);
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)g_czhc->GetBufferPointer();
g_cz = new D3DMATERIAL9[czzs];
if(g_cz == NULL)
return E_OUTOFMEMORY;
g_wenli = new LPDIRECT3DTEXTURE9[czzs];
if(g_wenli == NULL)
return E_OUTOFMEMORY;
for(DWORD i=0;i<czzs;i++)
{
g_cz = d3dxMaterials.MatD3D; //材料属性
g_cz.Ambient = g_cz.Diffuse; //设置模型材料的环境光反射系数, 因为模型材料本身没有设置环境光反射系数
g_wenli = NULL;
if(d3dxMaterials.pTextureFilename != NULL && strlen(d3dxMaterials.pTextureFilename) > 0)
{
D3DXCreateTextureFromFileA(g_pd3dDevice,d3dxMaterials.pTextureFilename,&g_wenli);
}
}
g_czhc->Release();
return S_OK;
}
VOID Cleanup()
{
//释放网格模型材质
if(g_cz != NULL)
delete[] g_cz;
//释放网格模型纹理
if(g_wenli)
{
for(DWORD i=0;i<czzs;i++)
{
if(g_wenli)
g_wenli->Release();
}
delete[] g_wenli;
}
if(mesh1 != NULL)
mesh1->Release();
if(mesh2 != NULL)
mesh2->Release();
if(g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if(g_pD3D != NULL)
g_pD3D->Release();
}
VOID Render()
{
//dx->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
//dx->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
g_pd3dDevice->BeginScene();
Inputresponse();
g_pd3dDevice->SetTransform(D3DTS_WORLD,&sys);
g_pd3dDevice->SetMaterial(&g_cz[0]);
mesh1->DrawSubset(0);
for(i=0;i<20;i++)
{
if(zidanbz==1)
{
zidan._42+=fu[1];
if(zidan._42>60.0f)
{
zidanbz=0;
}
g_pd3dDevice->SetTransform(D3DTS_WORLD,&zidan);
mesh2->DrawSubset(0);
}
}
g_pd3dDevice->EndScene();
g_pd3dDevice-> resent(NULL,NULL,NULL,NULL);
}
LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_KEYDOWN:
m_bKey[wParam] = 1;
return 0;
case WM_KEYUP:
m_bKey[wParam] = 0;
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,L"ClassName",NULL};
RegisterClassEx(&wc);
HWND hWnd = CreateWindow(L"ClassName",L"飞机游戏",WS_OVERLAPPEDWINDOW,100,100,600,600,GetDesktopWindow(),0,wc.hInstance,0);
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,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
}
UnregisterClass(L"ClassName",wc.hInstance);
return 0;
} |
|