做C++3D武汉游戏程序开发培训都需要什么工具

(软工的第二个作业)用OPENGL.C++做一个小的3D游戏
小伙伴的博客传送门:
深夜小福利:3D贪吃小蛇 下载传送门:链接:
密码: r87j
队员:刘畅 何雨点
咱们的小清新snake主要的步骤和程序思路主要是在他的博客里体现。
由于我们俩不是一个班的,所以讨论后编写博客的时间有些偏差。而且我相信相比刘畅同学来说,我的感悟体会更多,所以我就在我的博客里多啰嗦几句。
这里我主要是写写自己感想的:
感想第一个:两人做事的相互尊重和理解的重要性。一个人想问题时很容易卡在一个点上,怎么想也想不通。比如最开始由于考虑到我的水平问题,我想的是做一个最好简单而且容易操作的贪吃蛇的二维游戏就好了。(3D什么的不敢想)后来,也算是机缘巧合的认识了卓越班的刘畅同学,一起讨论了现在目前的水平以及能够做的是什么,还可以努力的方面在哪儿,一瞬间二维的贪吃蛇就可以进化为伪三维蛇了。感触真的好大,别人愿意帮你找到你的不足,并且耐心的教导带引你。这绝对是一个人所做不到的事情。不懂的一些东西,如果说是有人带你指引你这条路最好该怎么走,如何走才好,那么会省掉好多一个人在一个圈子来回打转的无用功。在这里,真的得再次的谢谢刘畅同学。
感想第二个:学习技能是一条漫长艰苦的道路,没有捷径,没有近路可抄,慢慢来。我们用opengl来实现的伪三维的效果,opengl不会?学!啥都不会?就从下载安装包装到VS2012里开始学着走。然后从建立一个点的坐标学习,然后到画线,然后到图形的构造,如何构造似立体的画面。然后到颜色的生成,蛇的首尾、地图的宽高、蛇转向等等。每一步都不能少,且每一步都少不了。
最后:祝各位亲玩儿得愉快~
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
----------------------------RACHEL-------------------------
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。想要弄个类似3D游戏的项目,演示开发全流程,大家看看项目取什么名字比较好 - C++当前位置:& &&&想要弄个类似3D游戏的项目,演示开发全流程,大家看想要弄个类似3D游戏的项目,演示开发全流程,大家看看项目取什么名字比较好&&网友分享于:&&浏览:8次想要搞个类似3D游戏的项目,演示开发全流程,大家看看项目取什么名字比较好项目目的就是想在论坛上,通过具体的项目大家一起来讨论整个开发流程和技术细节。无论项目是否成功,都是一个可供学习和探讨的对象。
项目周期定为三个月。
由于时间短,不会有精美的3D动画,只是让一些3D的物体能够通过用户控制,与机器控制的3D物体进行碰撞之类的战斗。还要通过背景控制物体的运动范围。
开发平台是linux,语言用C++,工具用Open&GL。
开发的文档,代码完全公开。
另外,这个项目是在论坛起个帖子好还是搞个空间或博客好。
我比较喜欢搞个帖子,象写网络小说一样比较有意思。------解决方案--------------------我早几年时就提议过,在论坛结成几个开发小组,每个组员按工作性质各司其职进行配合,每一次各组就同样的虚拟项目进行开发,从工期,质量,性能和效果等各方面进行评比讨论,总结提高.
但无一应者.你觉得你这个行吗?&现在搞3D游戏,都是用3D引擎,哪有自己造轮子直接用OG写的.这样的初学者跟书习作,还能建立起讨论组?------解决方案--------------------想法不错------解决方案--------------------支持,希望能贡献力量------解决方案--------------------不如github,然后互相聊的样子,能看到代码的推演.------解决方案--------------------5个最佳的3D游戏开发工具
http://blog.csdn.net/chszs/article/details/8228098
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有(Visual C++)游戏开发笔记之二——最简单的DirectX,vc窗口的编写
笔记一中我们介绍了如何用代码创建空的win32窗口,然而创建空的win32窗口只完成了一半的工作,接下来要做的工作是设置Direct3D,从而可以在屏幕上渲染图形。
Direct3D要调用很多函数才能成功设置API。一旦完成设置,并且设置成功,就可以向屏幕上渲染图形。
下面是函数中设置Direct3D所需的最少代码。
bool InitializeD3D(HWND hWnd, bool fullscreen)&
D3DDISPLAYMODE displayM&
// Create the D3D object.&
g_D3D = Direct3DCreate9(D3D_SDK_VERSION);&
if(g_D3D == NULL)&
// Get the desktop display mode.&
if(FAILED(g_D3D-&GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))&
// Set up the structure used to create the D3DDevice&
D3DPRESENT_PARAMETERS d3&
ZeroMemory(&d3dpp, sizeof(d3dpp));&
if(fullscreen)&
d3dpp.Windowed = FALSE;&
d3dpp.BackBufferWidth = 640;&
d3dpp.BackBufferHeight = 480;&
d3dpp.Windowed = TRUE;&
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;&
d3dpp.BackBufferFormat = displayMode.F&
// Create the D3DDevice&
if(FAILED(g_D3D-&CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,&
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))&
上段代码中的InitializeD3D函数的参数有窗口句柄hWnd,标识窗口是否全屏的标识符fullscreen。窗口句柄是在调用CreateWindows()函数创建窗口句柄时,返回给WinMain()函数的数值。InitializeD3D()函数开始先调用Direct3DCreat9()函数。Direct3DCreat9()函数将创建一个Direct3D接口对象,并返回该对象。该函数所带的参数值为D3D_SDK_VERSION。如果从该函数创建的接口不为NULL(空),那么接口创建成功。如果是NULL,那么创建接口时就会出错。其他步骤很大程度上取决于是否成功调用Direct3DCreat9()函数,所以一旦出现错误,就会立刻退出Direct3D初始化程序。
接下来调用的是GetAdapterDisplayMode()
函数。该函数将返回当前的显示信息,如桌面分辨率(宽度和高度),显示格式,显示器的刷新频率等。该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。将D3DADAPTER_DEFAULT发送给函数,详细说明代码,通过这些代码可以获取想要的主显卡信息。
检索显卡信息之后,函数接下来会创建D3DPRESENT_PARAMETERS对象。D3DPRESENT_PARAMETERS结构用于定义Direct3D窗口的显示信息。这样可以设置正在创建窗口的期望宽度和高度,刷新率,显示模式为全屏或窗口,后天缓存数目等。
D3DPRESENT_PARAMETERS结构体的定义:
typedef struct _D3DPRESENT_PARAMETERS_ {&
UINT BackBufferW //窗口宽度&
UINT BackBufferH //窗口高度&
D3DFORMAT BackBufferF //渲染后台缓存的格式&
UINT BackBufferC //想要用于渲染的后台缓存总数&
D3DMULTISAMPLE_TYPE MultiSampleT&
D3DSWAPEFFECT SwapE&
HWND hDeviceW&
BOOL EnableAutoDepthS&
D3DFORMAT AutoDepthStencilF&
UINT FullScreen_RefreshRateInHz;&
UINT FullScreen_PresentationI&
} D3DPRESENT_PARAMETERS;&
D3DPRESENT_PARAMETERS结构体是的前两个变量是BackBufferWidth( 窗口宽度 ),BackBufferHeight(窗口高度)。接下来的变量BackBufferFormat代表渲染后台缓存的格式。将D3DFMT_DEFAULT发送给该参数,就会得到所要用到的桌面格式。该参数可以接收的其他参数值分别是D3DFMT_A2R10G10B10(红、绿、蓝各10位,Alpha通道2位,总计32位),D3DFMT_A8R8G8B8(红、绿、蓝Alpha各8位,总计32位)、D3DFMT_X8R8G8B8、D3DFMT_AIR5G5B5、D3DFMT_XIR5G5B5和D3DFMT_R5G5B5。
BcakBufferCount是想要用于渲染的后台缓存总数。通常,使用一个后台缓存和一个主缓存,使用多个缓存会使动画更流畅,因为后台缓存上绘制内容,然后将结果复制到主缓存,主缓存将其显示在屏幕上。如果所有的事情都在主缓存处理,那么游戏玩家在玩游戏时,会看到正在刷新的屏幕,从而会产生视觉假象,破坏游
戏的视觉效果。成员变量MultiSampleType、MultiSampleQuality和SwapEffect处理交换效果。hDeviceWindow是调用WinMain()中的CreateWindow()函数创建的窗口句柄。Windowed标识符用于指定创建的窗口是否是全屏窗口。
EnableAutoDepthStencil标识符用于设置是否用Direct3D管理缓存深度以及模板缓存。AutoDepthStencilFormat将深度和模板缓存设置为BackBufferFormat可以使用的相同值之一。
结构中的最后三个变量分别是Flags、FullScreen_RefreshRateInHz和PresentationInterval。Flags标识符可以是D3DPRESENTFLAG_DEVICECLIP、D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL和D3DPRESENTFLAG_LOCKABLE_ BUFFER或D3DPRESENTFLAG_VIDEO的任意组合。变量FullScreen_RefreshRateInHz存储显示器的刷新率。对窗口模式程序而言,该值必须为0,但对全屏模式而言,该值取决于显示器。对此,可以调用GetDisplayAdapter()函数获取显示模式。最后一个变量PresentationInterval处理可以显示的交换链的后台缓存的最大次数。交换链主要让程序有多个窗口在桌面上同时显示(每个渲染自己的窗口)本书不涉及交换链的讨论,所以这里将不使用该变量。程序清单1.3 InitializeD3D()函数中调用的最后一个函数是CreateDevice()。该函数主要负责创建Direct3D设备对象,该对象用于向屏幕渲染图形。如果函数失败,最后一个参数(对象被发送给ppReturnedDeviceInterface)将为NULL(空)。测试函数是否失败的另一种方法是判断函数的返回值是否是D3D_OK以外的其他值。如果不是D3D_OK,则意味着创建过程中出现了问题,而且不会按照给定的规格创建设备。下面的代码给出了CreateDevice()的函数原型。
CreateDevice()函数原型代码如下:
HRESULT CreateDevice( UINT Adapter,&
D3DDEVTYPE DeviceType,&
HWND hFocusWindow,&
DWORD BehaviorFlags,&
D3DPRESENT_PARAMETERS *pPresentationParameters,&
IDirect3DDevice9 **ppReturnedDeviceInterface&
CreateDevice()函数中的第一个参数是Adapter。该参数用于指定正在使用的显卡。第二个参数DeviceType是一个标识符,用于指定Direct3D中的渲染方式。该参数的参数值可以是采用硬件渲染的D3DDEVTYPE_HAL、采用软件渲染的D3DDEVTYPE_REF、不需要软硬件支持的D3DDEVTYPE_NULLREF,或是采用要进行渲染工作的可插拔软件的D3DDEVTYPE_SW。软件渲染标识符允许运行Direct3D程序,它可以使用硬件不支持的特性。软件渲染存在的问题是渲染速度慢,尤其是在开发游戏时。
下一参数hFocusWindow也是一个窗口句柄。参数BehaviorFlags是标识符组合,用于指定设备的运行方式。
pPresentationParameter是一个指针,它指向该函数前面创建的D3DPRESENT_PARAMTERS结构。ppReturnedDeviceInterface是一个指针,它指向新创建的Direct3D设备对象。如果该对象为NULL(空),或是函数返回除D3D_OK以外的值,那么Direct3D设备的创建失败。
一旦完成Direct3D的设置和创建,就可以随意渲染屏幕。初始化阶段的CreateDevice()函数中创建的设备对象可以完成Direct3D中的渲染工作。渲染屏幕开始先要清屏为指定的颜色,告知Direct3D将要开始绘制新场景,渲染想要渲染的物体,完成屏幕渲染,在屏幕上显示渲染结果。代码1.6给出了验证这个过程的例子代码。例子代码创建简单的显示空白黑屏的函数。
在屏幕上绘制一个空白屏的代码:
void RenderScene()&
// Clear the backbuffer.&
g_D3DDevice-&Clear(0, NULL, D3DCLEAR_TARGET,&
D3DCOLOR_XRGB(0,0,0), 1.0f, 0);&
// Begin the scene. Start rendering.&
g_D3DDevice-&BeginScene();&
// End the scene. Stop rendering.&
g_D3DDevice-&EndScene();&
// Display the scene.&
g_D3DDevice-&Present(NULL, NULL, NULL, NULL);&
RenderScene()函数开始先清除后台缓存。调用Direct3D设备对象的Clear()函数可以完成该工作。Clear()函数的参数包括:要清除的矩形数目(0代表清除整个屏幕)、定义想要清除的屏幕区域矩形链表(NULL代表整个屏幕)、标识要清除内容的标识符、清除后的颜色、要设定的深度值、设定模板缓存值。对标识符参数而言,D3DCLEAR_DEFAULT清除所有的渲染目标,D3DCLEAR_STENCIL清除模板缓存,而D3DCLEAR_ZBUFFER清除深度缓存。后面将会更多地介绍深度缓存。
一旦完成清除工作,渲染函数将调用设备对象的BeginScene()函数,在Direct3D中启动一个新场景。在Direct3D中渲染任何图形前,都必须先调用BeginScene()函数。一旦渲染完要渲染的物体,就调用设备对象的EndScene()函数结束渲染。记住:每个BeginScene()函数必须有一个与之对应的EndScene()函数。由于这里只是绘制了一个空白窗口,所以在BeginScene()和EndScene()之间不需要添加任何代码。
最后一步是在屏幕上显示渲染结果。调用设备对象的Present()函数可以完成显示。就目前的学习而言,Present()函数的参数可以全部设为NULL(空)。第一个参数是正在显示的原始矩形,如果不使用交换链,那么该值必须为NULL(空)。第二个参数是一个指针,它指向要渲染的最终矩形。第三个参数是正在显示的窗口的窗口句柄。另外,由于没有用到交换链,所以对正在使用的窗口句柄而言,该值设为NULL(空)。这个正在使用的窗口句柄是在Direct3D初始化过程中为D3DPRESENT_PARAMETERS对象设置的窗口句柄。Present()函数中的最后一个参数是缓存区域,它代表需要更新的最小区域。同样,该参数涉及到交换链,也可以设为NULL(空)。
既然可以使用Direct3D初始化和渲染屏幕,那么剩下要做的工作是在退出程序时,释放对象。在Direct3D中,会发现通常要在退出程序前释放使用的内存,从而避免内存泄漏。所有要释放的内存都可以通过调用对象的Release()函数释放。Release()函数会减少对象的引用计数。如果引用计数降为0,那么系统就可以安全地从内存中删除对象。如果对单个对象有多个引用,那么必须牢记对所有的对象都要调用Release()函数,否则将不会释放内存。要牢记的规则就是:如果创建了对象,那么最终就要释放该对象。下述代码给出了在一个名为Shutdown()的函数中释放两个Direct3D对象的方法。
释放所有的Direct3D对象的代码
void Shutdown()&
if(g_D3DDevice != NULL) g_D3DDevice-&Release();&
if(g_D3D != NULL) g_D3D-&Release();&
g_D3DDevice = NULL;&
g_D3D = NULL;&
到这里,基本的模块都已经一目了然了,下面我们把他串联起来,构成一个整体。
&完整的Blank Window演示程序代码如下:
#include&d3d9.h&&
#pragma comment(lib, &d3d9.lib&)&
#pragma comment(lib, &d3dx9.lib&)&
#define WINDOW_CLASS &UGPDX&&
#define WINDOW_NAME &Blank D3D Window&&
// Function Prototypes...&
bool InitializeD3D(HWND hWnd, bool fullscreen);&
void RenderScene();&
void Shutdown();&
// Direct3D object and device.&
LPDIRECT3D9 g_D3D = NULL;&
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;&
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, ARAM wParam, LPARAM lParam)&
switch(msg)&
case WM_DESTROY:&
PostQuitMessage(0);&
return 0;&
case WM_KEYUP:&
if(wParam == VK_ESCAPE) PostQuitMessage(0);&
return DefWindowProc(hWnd, msg, wParam, lParam);&
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)&
// Register the window class&
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,&
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,&
WINDOW_CLASS, NULL };&
RegisterClassEx(&wc);&
// Create the application's window&
HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,&
100, 100, 640, 480, GetDesktopWindow(), NULL,&
wc.hInstance, NULL);&
// Initialize Direct3D&
if(InitializeD3D(hWnd, false))&
// Show the window&
ShowWindow(hWnd, SW_SHOWDEFAULT);&
UpdateWindow(hWnd);&
// Enter the message loop&
ZeroMemory(&msg, sizeof(msg));&
while(msg.message != WM_QUIT)&
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))&
TranslateMessage(&msg);&
DispatchMessage(&msg);&
RenderScene();&
// Release any and all resources.&
Shutdown();&
// Unregister our window.&
UnregisterClass(WINDOW_CLASS, wc.hInstance);&
return 0;&
bool InitializeD3D(HWND hWnd, bool fullscreen)&
D3DDISPLAYMODE displayM&
// Create the D3D object.&
g_D3D = Direct3DCreate9(D3D_SDK_VERSION);&
if(g_D3D == NULL)&
// Get the desktop display mode.&
if(FAILED(g_D3D-&GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))&
// Set up the structure used to create the D3DDevice&
D3DPRESENT_PARAMETERS d3&
ZeroMemory(&d3dpp, sizeof(d3dpp));&
if(fullscreen)&
d3dpp.Windowed = FALSE;&
d3dpp.BackBufferWidth = 640;&
d3dpp.BackBufferHeight = 480;&
d3dpp.Windowed = TRUE;&
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;&
d3dpp.BackBufferFormat = displayMode.F&
// Create the D3DDevice&
if(FAILED(g_D3D-&CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,&
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))&
void RenderScene()&
// Clear the backbuffer.&
g_D3DDevice-&Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);&
// Begin the scene. Start rendering.&
g_D3DDevice-&BeginScene();&
// End the scene. Stop rendering.&
g_D3DDevice-&EndScene();&
// Display the scene.&
g_D3DDevice-&Present(NULL, NULL, NULL, NULL);&
void Shutdown()&
if(g_D3DDevice != NULL) g_D3DDevice-&Release();&
if(g_D3D != NULL) g_D3D-&Release();&
只要成功安装了DirectX SDK,并配置好DirectX的开发环境,则万事俱备。
我们先编译该程序,然后运行它。我们可以看到一个640&480分辨率的空白窗口。
下面给出了运行后的窗口截图:&&
以上就是本节笔记的全部内容。
本节源代码请点击这里下载:【Visual C++】Code_Note_2&
请大家继续关注【 Visual C++】游戏开发笔记系列,谢谢大家一直的支持~~~
摘自& 枫落★流年距离二十世纪八十年代c++语言的诞生,到如今已经有三十多年的历史,随着c++语言的发展,它被应用于在越来越多的领域。
C++是一个多泛型的编程语言,它既可以面向过程,也是一门面向对象的语言。C++是一门使用非常广泛的计算机编程语言,因此它受到了越来越多程序员的亲睐。C++相关专家介绍:c++的就业领域很广泛,相对于java和其他语言来说有很多优点,很多大公司的服务器程序也都是基于C++开发的。目前c++软件开发主要集中在以下几个领域。
目前70%以上的网络游戏都是基于C++开发的,掌握C++已经成为游戏开发的基本要求。
操作系统及搜索引擎
目前计算机使用的Windows/Linux等操作系统内核均采用C语言写,在涉及大规模、高性能计算时,C/C++的运算速度和稳定性优势非常明显。
移动互联网应用
C++还用于目前非常流行的移动互联网应用程序的开发,比如苹果系列产品都是使用Object-C语言开发,它是一种根据C语言衍生出来的语言。
游戏程序师,一样的代码,不一样的人生!
游戏行业的现状和前景
“缺人”是游戏公司程序师岗位常见的现象,为什么主要以C++开发的游戏程序对人才要求如此渴望呢?会C++的人不是很多吗?据权威机构调查显示,游戏行业的人才缺口达60万,其中游戏程序开发师就有30万,占到了人才需求的一半!这是因为大学教育里教的仅是入门基础知识,对于实际的C++软件工程应用涉足不深。在游戏行业内达到中高级C++水平、同时具备专业领域技术如图形引擎、网络引擎的人凤毛麟角!
得到多少,就看你愿意付出多少
C++游戏开发课程特色
课程设计源自于企业真实岗位技术规范、流程, 全部是干货!
教学方法强调实战为王,全程剖析原理,代码实现, 您一学即会!
教学案例取自于当今天流行的游戏项目,商业代码, 货真价更值!
授课教师来自研发一线技术大牛,开发经验五年以上 您值得信赖!
完整专业级别的C++网游开发课程
版权!国内!
项目实战先行看
项目就要实战
我可以学C++网游开发吗?
周一至周五 9:00-18:00
公司:上海育创网络科技股份有限公司
地址:上海浦东世纪大道1500号东方大厦13、16层
电话:400-
北风学员交流⑤群:&nbsp&nbsp
(已满)&nbsp&nbsp&nbsp
北风网交流⑥群:&nbsp&nbsp
(已满)&nbsp&nbsp&nbsp
北风网交流⑦群:&nbsp&nbsp
&nbsp&nbsp&nbsp

我要回帖

更多关于 游戏程序开发培训学校 的文章

 

随机推荐