分享
 
 
 

如何创建Direct3D对象和设备的例子

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

//*********************************************

//功能:创建Direct3D对象和设备例子

//*********************************************

//防止链接出错

#pragma comment(lib,"d3d9.lib")

#pragma comment(lib,"d3dx9.lib")

#pragma comment(lib,"dinput8.lib")

#pragma comment(lib,"dxguid.lib")

#include//windows程序你不包含着是不可能的

#include//即然是DX9程序那肯定是需要包含着个头文件的

//接下来定义一个Windows类的宏名称

#define MY_WINCLASS_NAME "Direct3d"

//养成好习惯先声明一下

HRESULT InitMy3D(HWND hWnd);

void Cleanup();

LRESULT WINAPI MsgProc(HWND hWnd,UINT msg ,WPARAM wParam,LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow) ;

//记着程序是Direct3d编程时,我们必须先创建Direct3D对象,在程序结束的时候,也必须最后释放该对象。

//为了保存创建的Direct3D对象和设备,那我们就需要以下的两个全局变量

//在这碰到点问题编译的时候到这不能正常编译,再把下面这两个在手工的重写一边,别偷懒,一个字一个字的敲。

//LPDIRECT3D9

pD3D = NULL;

//定义Direct3D对象的指针,初始化为空

//LPDIRECT3DDEVICE9 pDev = NULL;

//定义Direct3D设备的指针,初始之为空

LPDIRECT3D9

pD3D = NULL;

LPDIRECT3DDEVICE9 pDev = NULL;

//到这就要开始写方法了既然是DX9程序那就要初始化D3D的环境

//---------------------------------------------------------

//方法名:InitD3D()

//功

能:初始化D3D环境,函数创建了Direct3D对象和Direct3D设备。

//注

意:函数返回E_FAIL表示失败,返回E_OK表示成功

//

说到这了就需要提到一些额外的知识

//

在Direct3D中,提供了两个宏专门用于测试函数是否调用成功。

//

1. FAILED()----对该函数返回的错误进行测试,如果函数返回任何错误信息,该测试之为真。

//

2.SUCCEEDED()--对函数执行是否成功进行测试,如函数执行成功,值为真.

//---------------------------------------------------------

HRESULT InitMy3D(HWND hWnd)

{

//创建Direct3D对象,这是使用Direct3D的第一步操作

if(NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION )))

return E_FAIL;

//获取当前Windows桌面的显示模式,保存到定义的d3ddm结构中

D3DDISPLAYMODE d3ddm;

//到这用到了上面“注意”中提到的宏。

//看好了当写到pD3D-时输入了">"这个符号而没有出现下拉列表那就是前面你写错了,赶快去查错。

if( FAILED( pD3D-GetAdapterDisplayMode( D3DADAPTER_DEFAULT,&d3ddm)))

return E_FAIL;

//定义Presend结构

D3DPRESENT_PARAMETERS d3dpp;

//把结构清零,创建设备时,结构成员值为0表示使用缺省值

ZeroMemory(&d3dpp,sizeof(d3dpp));

//制定创建的Direct3D是支持窗口的设备

d3dpp.Windowed = TRUE;

//指定交换效果为D3DSWAPEFFECT_DISCARD,即把后台表面显示到前台表面以后

//原来的后台表面包含的信息自动丢失

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

//后台缓冲区的点格式与当前显示模式的点格式一致

d3dpp.BackBufferFormat = d3ddm.Format;

//D3D对象都创建了那就该创建Direct3D设备了

//1。使用主显卡创建设备,参数D3DADAPTER_DEFAULT.(如果你的计算机里插了两块显卡那你就的指定清楚,看来微软早遇见了PCI_E的出现)

//2。设备类型为硬件抽象设备,使用硬件加速能,参数D3DDEVTYPE_HAL

//3。使用前面创建的窗口用于目标表面的显示,参数hWnd

//4。指定设备对于顶点的处理能力为软件处理顶点,这是为了让所有的显卡制持,参数

// D3DCREATE_SOFTWARE_VERTEXPROCESSING

if(FAILED(pD3D-CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&pDev)))

{

return E_FAIL;

}

return S_OK;

//把上面的看明白了最后的三行你就知道是干吗的了

}

//-----------------------------------------------------------------------------------------------

//方法名:Cleanup()

//功

能:释放创建过的Direct3D对象和设备

//注

意:C++可不是JAVA有垃圾回收机制,你得把你申请的资源在用完后还给电脑

//-----------------------------------------------------------------------------------------------

void Cleanup()

{

//释放时的顺序为先释放创建的设备后释放对象

if(pDev !=NULL)

pDev-Release();

//Direct3D对象最先创建,但需要最后释放

if(pD3D != NULL)

pD3D-Release();

return;

//如果你不明白为何这样释放,去把你的C++在复习一下

}

//-------------------------------------------------------------------------------------------------------------------

//方法名:MsgProc()

//功

能:Windows的详细处理函数

//注

意:消息是游戏程序的另一个重点,它用于处理键盘,鼠标,遥杆的响应以及触发的事件

//

如:主角挥剑砍怪物会发生剑和怪物的碰撞,就需要把这一消息处理是打怪物没打上还是打上,打伤了如何计算伤害等等。

//-------------------------------------------------------------------------------------------------------------------

LRESULT WINAPI MsgProc(HWND hWnd,UINT msg ,WPARAM wParam,LPARAM lParam)

{

switch(msg)

{

case WM_DESTROY:

PostQuitMessage(0);

return 0;

case WM_PAINT:

//清除渲染目标表面,使用的颜色是RGB(255,255,255),即白色

pDev-Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255, 255, 255),1.0f,0);

//把渲染的目标表面显示到窗口的客户区域

pDev-Present(NULL,NULL,NULL,NULL);

ValidateRect(hWnd,NULL);

return 0;

}

return DefWindowProc(hWnd,msg,wParam,lParam);

}

//--------------------------------------------------------------------------------------------------------------------

//方法名:WinMain()

//功

能:Windows主函数,程序启动时,从这里开始

//注

意:你要是不写他,你就完了

//--------------------------------------------------------------------------------------------------------------------

int APIENTRY WinMain(HINSTANCE hInstance,

//hInstance:表示该应用程序的句柄

HINSTANCE hPrecInstance,//hPrevInstance:为了保持与16位windows应用程序的兼容性

LPSTR lpCmdLine,

//lpCmdLine:指向命令行参数字符串的指针

int nCmdShow)

//nCmdShow:指定应用程序窗口显示方式的整数

{

//定义一个类,指定消息的处理函数为MsgProc

WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0l,0l,

GetModuleHandle(NULL),NULL,NULL,NULL,NULL,

MY_WINCLASS_NAME,NULL};

//注册这个窗口类

RegisterClassEx(&wc);

//创建应用程序窗口

HWND hWnd = CreateWindow(MY_WINCLASS_NAME,"3D游戏编程--创建Direct3D对象和设备",

WS_OVERLAPPEDWINDOW,100,100,400,300,

GetDesktopWindow(),NULL,wc.hInstance,NULL);

//调用InitMy3D函数对3D对象和设备初始化,传入的参数为窗口的句柄hWnd

if(SUCCEEDED(InitMy3D( hWnd)))

{

//显示窗口

ShowWindow(hWnd,SW_SHOWDEFAULT);

UpdateWindow(hWnd);

//程序主循环,进行窗口消息的分发,消息的处理在MsgProc函数中完成

MSG msg;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

//调用Cleanup函数清除3D对象和设备

Cleanup();

//注销窗口类

UnregisterClass(MY_WINCLASS_NAME,wc.hInstance);

return 0;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有