|

楼主 |
发表于 2006-7-25 23:03:00
|
显示全部楼层
Re:声明LPDIRECTINPUT8 didxzz = NULL;报错。请教怎么解决?
#include <d3dx9.h>
#include <d3d9.h>
#include <d3dx9math.h>
//#include <dinput.h>
//#include <windows.h>
//#include <winuser.h>
//--------------------------------------------------------------------------
LPDIRECT3D9 dxdxzz = NULL; // Direct3D对象指针
LPDIRECT3DDEVICE9 dxsbzz = NULL; // Direct3D设备指针
LPDIRECT3DVERTEXBUFFER9 ddhcq1 = NULL;// 顶点缓冲区指针
LPDIRECT3DVERTEXBUFFER9 ddhcq2=0;
LPDIRECT3DINDEXBUFFER9 syhcq1=0;//索引缓冲区
//LPDIRECTINPUT8 didxzz = NULL;//IDirectInput对象指针
//LPDIRECT3DTEXTURE9 wldxzz = NULL;//纹理对象指针
LPDIRECT3DVERTEXDECLARATION9 ddsmdx;//顶点声明对象。
IDirect3DVertexShader9* ddxrhs=0;//顶点渲染函数。
IDirect3DVertexShader9* ddxrhs2=0;
IDirect3DPixelShader9 *xsxrhs=NULL;//像素渲染函数。
IDirect3DPixelShader9 *xsxrhs2=0;
HWND ckjb;//定义窗口句柄。
//-----------------------------------------------------------------------------函数声明。
LRESULT WINAPI chuangkouguocheng(HWND ckjb, UINT msg, WPARAM wParam, LPARAM lParam);
void huitu();//绘图。
void shifangziyuan();//释放资源。
//void zuobiaozhuanhuan();//坐标转换。
//void guangzhao();//光照。
void chushihuadx();//初始化dx。
void xuanran();//渲染。
void zbzh();//坐标转换。
//-----------------------------------------------------------------------------变量声明。
float x=1.0f,y=3.0f,z=5.0f,xjd=0,yjd=0,zjd=0;
//D3DXMATRIXA16 dimianjz;//地面矩阵
//-----------------------------------------------------------------------------数组声明。
float a1[19]={0.0f,3.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,-10.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f ,90.0f,1.0f,1.0f,100.0f};
float a[19];
//-----------------------------------------------------------------------------定义结构体。
struct ddjg
{
D3DXVECTOR3 x;
D3DXVECTOR3 y;
};
//-----------------------------------------------------------------------------入口函数。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS chuangkoulei;//定义窗口类。
//窗口风格,P671。
chuangkoulei.style=0;//CS_HREDRAW | CS_VREDRAW;
//指向窗口过程。
chuangkoulei.lpfnWndProc=chuangkouguocheng;
//指定紧随WNDCLASS数据结构后分配的字节数,系统将起初始化为0。
chuangkoulei.cbClsExtra=0;
//指定紧随窗口实例之后分配的字节数,系统将起初始化为0。P671
chuangkoulei.cbWndExtra=0;
//标识了该窗口类的窗口过程所在的模块实例的句柄,不能为NULL。
chuangkoulei.hInstance=hInstance;
//标识了该窗口类的图标。P672
chuangkoulei.hIcon=LoadIcon(NULL,IDI_ERROR);//读标准图标。
//标识了该窗口类的光标。P672
chuangkoulei.hCursor=LoadCursor(NULL,IDC_ARROW);//读标准光标。
//背景颜色。P672
chuangkoulei.hbrBackground=0;//(HBRUSH)GetStockObject(BLACK_BRUSH);//设置背景。
//菜单名。P672
chuangkoulei.lpszMenuName=NULL;
//定义窗口类的名字。
chuangkoulei.lpszClassName="chuangkouleiming";
//注册窗口类。
RegisterClass(&chuangkoulei);
//创建窗口。
//CreateWindow(窗口类名,标题栏,窗口样式P11,X1,Y1,X2,Y2,指向创建此窗口的父窗口,
// 指向菜单的句柄,模块实例句柄,指向结构指针P11。)
//GetDesktopWindow()获取桌面窗口句柄,无返回值。
ckjb=CreateWindow("chuangkouleiming","biaotilan",WS_OVERLAPPEDWINDOW,
100,100,800,600,GetDesktopWindow(),0,hInstance,0);
//初始化dx。
chushihuadx();
//显示窗口。
ShowWindow(ckjb,SW_SHOWDEFAULT);
//更新窗口。
UpdateWindow(ckjb);
//消息循环。
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
//GetMessage(指向MSG结构,标识要检查其消息的窗口 如果为NULL 则获取调用该函数的程序的任一
// 窗口,要获取的消息的最小整数值,--最大整数值。最后两个参数为0则获取所有消息。)
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
shifangziyuan();//释放资源,退出程序。
UnregisterClass("chuangkoulei",chuangkoulei.hInstance);
return 0;
}
//-------------------------------------------------------------------------窗口过程。
LRESULT WINAPI chuangkouguocheng(HWND ckjb, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN:
{
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
case VK_UP:
y=y-0.2f;
// huitu();
break;
case VK_DOWN:
y=y+0.2f;
// huitu();
break;
case VK_LEFT:
x=x-0.2f;
// huitu();
break;
case VK_RIGHT:
x=x+0.2f;
// huitu();
break;
case 69://e
a1[1]=a1[1]+0.2f;
break;
case 68://d
a1[1]=a1[1]-0.2f;
break;
case 70://f
yjd=yjd+0.1f;
break;
case 83://s
yjd=yjd-0.1f;
break;
case 71://g
xjd=xjd+0.1f;
break;
case 72://h
xjd=xjd-0.1f;
break;
case 73://i
zjd=zjd+0.1f;
break;
case 74://j
zjd=zjd-0.1f;
break;
}
}
//case WM_DESTROY://窗口结束消息。
// PostQuitMessage(0);
// return 0;
case WM_PAINT://无消息。P704
xuanran();
// ValidateRect( ckjb, NULL );
return 0;
}
return DefWindowProc(ckjb,msg,wParam,lParam);//其他消息。
return 0;
}
//----------------------------------------------------------------------渲染。
void xuanran()
{
dxsbzz->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,//?
D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
dxsbzz->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
dxsbzz->BeginScene();
for(int i=0;i<19;i++)
{
a=a1;
}
zbzh();
//设置当前渲染的顶点声明对象,表示渲染的渲染数据流的顶点信息,
dxsbzz->SetVertexDeclaration( ddsmdx );//(顶点声明对象)
//顶点缓冲区中的内容与相应的渲染数据流关联。
//SetStreamSource(渲染数据流序号,顶点缓冲区指针,启始位置,顶点大小)
dxsbzz->SetStreamSource( 0, ddhcq1, 0, sizeof(ddjg) );
//设置当前的顶点渲染函数。
dxsbzz->SetVertexShader( ddxrhs );//(顶点渲染函数)
dxsbzz->SetPixelShader( xsxrhs); //(像素渲染函数)
//dxsbzz: rawPrimitive(图元类型P36,绘制的起始顶点索引值,图元数量。)
// dxsbzz->DrawPrimitive( D3DPT_TRIANGLELIST, 0,2);
//关联索引缓冲区。
dxsbzz->SetIndices(syhcq1);
//DrawIndexedPrimitive(图元类型P36,索引缓冲区的启始地址,最小的索引值,绘制的顶点数目,
//第几个点开始绘制,图形数量。)
dxsbzz->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,12,0,12);
dxsbzz->EndScene();
dxsbzz-> resent( NULL, NULL, NULL, NULL );
}
//-----------------------------------------------------------------------释放资源。
void shifangziyuan()
{
dxsbzz->Release();
dxdxzz->Release();
ddhcq1->Release();
//wldxzz->Release();
}
//-----------------------------------------------------------------------初始化DX。
void chushihuadx()
{
dxdxzz = Direct3DCreate9( D3D_SDK_VERSION );//创建DX对象。
//创建DX设备对象。P17
//设置传递给LPDIRECT3D9::CreateDevice的参数
//D3DDISPLAYMODE d3ddm;
//dxdxzz->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );//查询显示模式信息。
D3DPRESENT_PARAMETERS d3dpp;//设备信息结构。
ZeroMemory( &d3dpp, sizeof(d3dpp) );//用0填充内存区域。
d3dpp.Windowed = TRUE;//显示方式,TRUE=窗口,FALSE=全屏。
d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;//后台缓存复制到前台后,清除后台缓存内容。
d3dpp.hDeviceWindow=ckjb;//关联窗口句柄。
d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;//d3ddm.Format;//D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;//打开深度缓冲区。
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//深度缓冲区中一个像素由16位整数表示。
//CreateDevice(显示卡序号,DX设备类型,所属窗口句柄,DX设备进行3D运算的方式P18,
//存储DX设备信息的变量地址,返回DX设备接口指针的地址。)
dxdxzz->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
ckjb,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &dxsbzz );
//创建顶点缓冲区。P42
//CreateVertexBuffer(大小 字节,属性,顶点格式,内存位置,ddhcqzz,保留)
dxsbzz->CreateVertexBuffer( 10240,0, 0,D3DPOOL_DEFAULT, &ddhcq1,NULL );
// dxsbzz->CreateVertexBuffer( 10240,0, 0,D3DPOOL_DEFAULT, &ddhcq2,NULL );
//创建索引缓冲区。
//CreateIndexBuffer(大小 字节,属性,元素格式16位或32位索引,内存位置,syhcqzz,保留)
dxsbzz->CreateIndexBuffer(100,0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&syhcq1,0);
//绘图。
huitu();
D3DVERTEXELEMENT9 ddgs1[] =//顶点格式1。
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, 3, 0 },
D3DDECL_END()
};
//创建顶点声明对象。CreateVertexDeclaration(顶点格式,顶点声明对象指针的存储地址)
dxsbzz->CreateVertexDeclaration( ddgs1, &ddsmdx );
//*创建顶点渲染函数。
//编译渲染指令。
LPD3DXBUFFER zldmdz;//指令代码地址。
//c4亮度,c5光的方向向量,c6反射系数。
char xrzl[]="vs_2_0 \n dcl_position v0 \n dcl_normal v1 \n def c4,0.9f,0.9f,0.9f,0.0f \n def c5,0.5f,0.7f,0.2f,0.0f def c6,0.1f,0.7f,0.3f,0.0f m4x4 oPos,v0,c0 \n dp3 r0,v1,c5 mul r1,r0,c4 mul oD0,r1,c6";
//D3DXAssembleShader(渲染指令,渲染指令长度,顶点渲染预定义0,D3D效果文件使用0,
// 编译指令选项0,指令代码地址,生成错误信息 0=不生成,P257)
D3DXAssembleShader(xrzl,strlen(xrzl),0,0,0,&zldmdz,0);
//创建顶点渲染函数CreateVertexShader(指令地址,生成的顶点渲染函数指针。)
dxsbzz->CreateVertexShader((DWORD*)zldmdz->GetBufferPointer(),&ddxrhs);
zldmdz->Release();
//*/
//创建像素渲染函数。
LPD3DXBUFFER xszldz;//像素指令地址。
char xszl[]="ps_2_0 \n def c1,0.9f,0.5f,0.3f,0.0f \n dcl v0 \n mov oC0,v0 \n";//像素指令
//D3DXAssembleShader(渲染指令,渲染指令长度,顶点渲染预定义0,D3D效果文件使用0,
// 编译指令选项0,指令代码地址,生成错误信息 0=不生成,P257)
D3DXAssembleShader(xszl,strlen(xszl),0,0,0,&xszldz,0);
dxsbzz->CreatePixelShader((DWORD*)xszldz->GetBufferPointer(),
&xsxrhs);
xszldz->Release();
}
//-----------------------------------------------------------------------------绘图。
void huitu()
{
//*
ddjg* nczzdz;//内存指针地址。
//ddhcqzz: ock(加锁内存起始地址,加锁内存大小,返回内存指针地址,属性P44。)
ddhcq1->Lock( 0, 0, (void**)&nczzdz, 0 );
//定义三角形顶点数据。
nczzdz[0].x=D3DXVECTOR3(0.0f,0.0f,0.0f);//0 0 0 0
nczzdz[0].y=D3DXVECTOR3(1.0f,0.0f,0.0f);
nczzdz[1].x=D3DXVECTOR3(1.0f,0.0f,0.0f);//1 0 0 1
nczzdz[1].y=D3DXVECTOR3(0.0f,1.0f,0.0f);
nczzdz[2].x=D3DXVECTOR3(2.0f,0.0f,0.0f);//2 0 0 2
nczzdz[2].y=D3DXVECTOR3(0.0f,0.0f,1.0f);
nczzdz[3].x=D3DXVECTOR3(3.0f,0.0f,0.0f);//3 0 0 3
nczzdz[3].y=D3DXVECTOR3(1.0f,1.0f,1.0f);
nczzdz[4].x=D3DXVECTOR3(0.0f,0.0f,1.0f);//0 0 1 4
nczzdz[4].y=D3DXVECTOR3(1.0f,0.0f,1.0f);
nczzdz[5].x=D3DXVECTOR3(1.0f,0.0f,1.0f);//1 0 1 5
nczzdz[5].y=D3DXVECTOR3(0.0f,1.0f,1.0f);
nczzdz[6].x=D3DXVECTOR3(2.0f,0.0f,1.0f);//2 0 1 6
nczzdz[6].y=D3DXVECTOR3(1.0f,1.0f,0.0f);
nczzdz[7].x=D3DXVECTOR3(3.0f,0.0f,1.0f);//3 0 1 7
nczzdz[7].y=D3DXVECTOR3(2.0f,0.0f,0.0f);
nczzdz[8].x=D3DXVECTOR3(0.0f,0.0f,2.0f);//0 0 1 8
nczzdz[8].y=D3DXVECTOR3(0.0f,1.0f,0.0f);
nczzdz[9].x=D3DXVECTOR3(1.0f,0.0f,2.0f);//1 0 1 9
nczzdz[9].y=D3DXVECTOR3(0.5f,1.5f,0.5f);
nczzdz[10].x=D3DXVECTOR3(2.0f,0.0f,2.0f);//2 0 1 10
nczzdz[10].y=D3DXVECTOR3(1.0f,2.0f,1.0f);
nczzdz[11].x=D3DXVECTOR3(3.0f,0.0f,2.0f);//3 0 1 11
nczzdz[11].y=D3DXVECTOR3(1.5f,2.5f,1.5f);
ddhcq1->Unlock();
WORD lssz[]={0,1,4,1,4,5,1,5,2,2,6,5,6,3,2,3,7,6,5,8,4,5,8,9,9,6,5,6,9,10,10,7,6,10,7,11};
void *synczzdz;//索引内存指针地址。
syhcq1->Lock( 0, 0, (void**)&synczzdz, 0 );
memcpy(synczzdz,lssz,sizeof(lssz));
syhcq1->Unlock();
}
void zbzh()
{
D3DXMATRIXA16 MatResult;
D3DXMATRIXA16 matWorld;
D3DXMATRIXA16 pyjz;
D3DXMATRIXA16 xzjzx;
D3DXMATRIXA16 xzjzy;
D3DXMATRIXA16 xzjzz;
// UINT iTime = timeGetTime() % 1000;
// FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
D3DXMatrixTranslation(&pyjz,a[0],a[1],a[2]);
D3DXMatrixRotationX( &xzjzx,a[3] );
D3DXMatrixRotationY( &xzjzy,a[4] );
D3DXMatrixRotationZ( &xzjzz,a[5] );
D3DXMatrixMultiply(&matWorld,&xzjzx,&xzjzy);
D3DXMatrixMultiply(&matWorld,&matWorld,&xzjzz);
D3DXMatrixMultiply(&matWorld,&matWorld,&pyjz);
// D3DXMatrixTranslation( &matWorld, 0,0,0 );
D3DXVECTOR3 vEyePt( a[6], a[7],a[8] );
D3DXVECTOR3 vLookatPt( a[9], a[10], a[11]);
D3DXVECTOR3 vUpVec( a[12], a[13], a[14] );
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, a[15], a[16], a[17],a[18] );
D3DXMatrixMultiply (&MatResult,&matWorld,&matView);
D3DXMatrixMultiply (&MatResult,&MatResult,&matProj);
D3DXMatrixTranspose( &MatResult, &MatResult );
dxsbzz->SetVertexShaderConstantF( 0, (float*)&MatResult, 4 );
} |
|