如何使用DirectX制作RPG游戏(一)开发环境搭建
1、安装visual studio 2017 ,可参考链接,请确保勾选c/c++桌面应用程序开发工具。
2、下载directx SDK,本文下载的是2010 June版本,已经默认集成了direct9/10/11 ,开发directx程序就够了。
3、学习DirectX开发,所需要的基本知识。
1)c/c++编程知识,不需要精通,但需要经常实践,想写出一流的程序,需要长期不断的学习
2)学习DirectX 3D开发还必须学习和掌握一些数学知识。 如,掌握向量几何和向量代数,以及它们在3D计算机图形学中的应用, 掌握矩阵,矩阵代数,以及如何借助矩阵进行3D几何变换,掌握用代数对平面和射线建模的方法,熟悉D3DX库中专门用于进行3D数学运算的部分类和函数。
4、使用Visual Studio VC++向导创建Window桌面工程。加入DirectX3D 头文件和库文件到工程中,在必要的地方加入Direct3D 初始化代码和渲染函数。
一般是在创建windows窗口后初始化Direct3D,在消息循环中加入渲染绘制函数。
1、获取接口IDirect3D9的指针。该接口用于获取系统中物理硬件设备的信息并创建接口IDirect3DDevice9,该接口是一个C++对象,代表了我们用来显示3D图形的物理硬件设备。
IDirect3D9* d3d9=0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
2、检查设备性能(D3DCAPS9),判断主显卡(primary display adapter 或primary graphics card)是否支持硬件顶点运算。为了创建接口IDirect3DDevice9,我们必须明确显卡是否支持该功能。
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
int vp = 0;
if (caps.DevCaps& D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
3、初始化D3DPRESENT_PARAMETERS结构的一个实例。该结构由许多数据成员组成,我们可以通过这些变量来指定即将创建的接口IDirect3DDevice9的特性。
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
4、利用已初始化的D3DPRESENT_PARAMETERS结构创建IDirect3DDevice9对象(一个C++对象,代表了我们用来显示3D图形的物理硬件设备)。
HRESULT hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, device);
if (FAILED(hr))
{
::MessageBox(0, L"CreateDevice()-Failed", 0, 0);
return false;
}
5、添加渲染函数,所有的绘制方法都必须在IDirect3DDevice9::BeginScene 和IDirect3DDevicer9::EndScene构成的方法对之间进行调用,如
_device->BeginScene();
_device->DrawPrimiteive(...);
_device->EndScene(); 示例代码为:
device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
device->BeginScene();
device->SetFVF(ColorVertex::FVF);
device->SetStreamSource(0, triangle, 0, sizeof(ColorVertex));
D3DXMatrixTranslation(&world, -0.25f, 0.0f, 0.0f);
device->SetTransform(D3DTS_WORLD, &world);
device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
D3DXMatrixTranslation(&world, 0.25f, 0.0f, 0.0f);
device->SetTransform(D3DTS_WORLD, &world);
device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
device->EndScene();
device->Present(0, 0, 0, 0);