多语言展示
当前在线:269今日阅读:78今日分享:13

如何使用DirectX制作RPG游戏(一)开发环境搭建

序言游戏时间到,你操起键盘,戴上耳机,桌上摆上零食和饮料,在荡气回肠的游戏背景音乐中你开始了游戏,直到天昏地暗,手指磨出血泡,眼睛布满血丝,早先点的外卖已经冷了数个小时......。你站起身,放眼窗外,已是黄昏。数年之后,你也许会回想起先前的一个个不眠之夜,觉得人生如同虚妄。那个时候你会觉得游戏害了自己,后悔得不要不要的。其实小编告诉你,开发制作游戏的乐趣远胜于不眠不休地玩游戏。你可以在开发制作游戏的过程中充实自己的知识,增加自己的技术实力制作游戏的过程更是一个对自己挑战的过程,这会让你痴迷并带有乐趣地追求此过程制作游戏毫无疑问就是一门艺术,需要坚持,乐趣,各种知识,一般人还真搞不成有一天,你看到别人津津有味地玩自己开发制作的游戏,朋友,请如何告诉我那一刻你的感受(可留言)。本经验是连载,记录使用DirectX开发制作RPG游戏的全过程。包含以下内容:开发环境搭建DirectX SDK基础知识游戏开发过程中用到的各种软件制作RPG游戏需要用到的脚本技术游戏架构设计C/C++开发的相关知识和技巧游戏开发经常用到的数据结构游戏素材和精灵的制作3D模型制作常用软件粒子系统游戏美工方面的一些知识游戏策划游戏发布应用商店的一些介绍跨平台一些方面的考虑游戏引擎的介绍和使用游戏推广的简要介绍移动平台游戏制作的一些探讨本篇介绍如何使用DirectX制作RPG游戏(一)开发环境搭建
工具/原料

directx SDK (本文使用DX9.0)

方法/步骤
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,在消息循环中加入渲染绘制函数。

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);

推荐信息