结合directx3D函数库3D视角游戏
小组(罗胜文 、 李长燕)
一.项目概况
随着因特网的普及和快速发展,国内的用户不断的增长。游戏已经成为许多用户不可或缺的娱乐项目。在玩过太多的平面2D游戏后,大部分玩家已经不在满足于2D平面的视觉效果,3D游戏采用立体空间坐标的概念,显得场景更加真实、逼真,因此更能吸引用户。这款游戏结合directx3D函数库3D视角游戏,类似于很流行的游戏《英雄联盟》,但它以3D的形式呈现,能够产生给人意想不到的视觉效果。
二.需求分析
1、把普通的平面游戏变成3D的游戏。
2、在过去一些流行游戏的基础上设计出新的游戏,加一些增量式的创新。
三.软件设计
工作平台:
采用C++语言,调用directx图形接口,windows8.1 x64 操作系统 visual studio 2013。
设计思路:
1、游戏的基本设计原则:保持简单性原则,分开数据处理和图像渲染,提高游戏性能。
2、采用面向对象的设计思路,重点在于3D图形的渲染,通过调用directx图形库函数完成。
四.程序描述
一.类名及描述
1、CameraClass:游戏地图视角
2、DInputClass:鼠标、键盘输入类,接受从鼠标、键盘传入的消息
3、SkyBoxClass:天空渲染类,渲染天空视图
4、SnowParticleClass:粒子系统类,用来渲染天空雪花飘落的类
5、XFileModelClass:加载资源和图形类
6、TerrainClass:纹理类
二、类相关调用关系图:
三、入口函数
//*****************************************************************************************
// Name: WinMain( )
// Desc: Windows应用程序入口函数
//*****************************************************************************************
int WINAPIWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
//开始设计一个完整的窗口类
WNDCLASSEXwndClass={0} ; //用WINDCLASSEX定义了一个窗口类,即用wndClass实例化了WINDCLASSEX,用于之后窗口的各项初始化
wndClass.cbSize= sizeof( WNDCLASSEX ) ; //设置结构体的字节数大小
wndClass.style =CS_HREDRAW |CS_VREDRAW; //设置窗口的样式
wndClass.lpfnWndProc= WndProc; //设置指向窗口过程函数的指针
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance= hInstance; //指定包含窗口过程的程序的实例句柄。
wndClass.hIcon=(HICON)::LoadImage(NULL,_T("GameMedia\\icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);//从全局的::LoadImage函数从本地加载自定义ico图标
wndClass.hCursor= LoadCursor(NULL, IDC_ARROW ); //指定窗口类的光标句柄。
wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //为hbrBackground成员指定一个灰色画刷句柄
wndClass.lpszMenuName= NULL; //用一个以空终止的字符串,指定菜单资源的名字。
wndClass.lpszClassName= _T("ForTheDreamOfGameDevelop"); //用一个以空终止的字符串,指定窗口类的名字。
if( !RegisterClassEx(&wndClass ) ) //设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口
return -1;
HWNDhwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE, //喜闻乐见的创建窗口函数CreateWindow
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, SCREEN_WIDTH,
SCREEN_HEIGHT, NULL, NULL, hInstance, NULL );
//Direct3D资源的初始化,调用失败用messagebox予以显示
if (!(S_OK==Direct3D_Init(hwnd,hInstance)))
{
MessageBox(hwnd,_T("Direct3D初始化失败~!"),_T("浅墨的消息窗口"), 0);//使用MessageBox函数,创建一个消息窗口
}
PlaySound(L"GameMedia\\Doom.wav",NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //循环播放背景音乐
MoveWindow(hwnd,200,10,SCREEN_WIDTH,SCREEN_HEIGHT,true); //调整窗口显示时的位置,窗口左上角位于屏幕坐标(200,10)处
ShowWindow(hwnd, nShowCmd ); //调用Win32函数ShowWindow来显示窗口
UpdateWindow(hwnd); //对窗口进行更新,就像我们买了新房子要装修一样
//进行DirectInput类的初始化
g_pDInput = new DInputClass();
g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND |DISCL_NONEXCLUSIVE,DISCL_FOREGROUND |DISCL_NONEXCLUSIVE);
//消息循环过程
MSG msg= { 0 }; //初始化msg
while(msg.message != WM_QUIT ) //使用while循环
{
static FLOAT fLastTime = (float)::timeGetTime();
static FLOAT fCurrTime = (float)::timeGetTime();
static FLOAT fTimeDelta = 0.0f;
fCurrTime = (float)::timeGetTime();
fTimeDelta = (fCurrTime - fLastTime) / 1000.0f;
fLastTime = fCurrTime;
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) //查看应用程序消息队列,有消息时将队列中的消息派发出去。
{
TranslateMessage(&msg ); //将虚拟键消息转换为字符消息
DispatchMessage(&msg ); //该函数分发一个消息给窗口程序。
}
else
{
Direct3D_Update(hwnd,fTimeDelta); //调用更新函数,进行画面的更新
Direct3D_Render(hwnd,fTimeDelta); //调用渲染函数,进行画面的渲染
}
}
UnregisterClass(_T("ForTheDreamOfGameDevelop"), wndClass.hInstance);
return0;
}
五.测试报告
一.游戏界面:
二.背景天空
三.背景效果
四.操作执行
五.游戏地图
六.性能分析
1.总体性能分析
2.CPU使用分析:
3.GPU使用分析
4.内存占用分析
七.改进计划
1、 地形可以任意穿越,这对一个真正的3D游戏来说是不合理的,多以这个是以后改进的一个方向。
2、 角色的动态,现在还不能完成角色的创建,动态进行游戏,也是这个游戏需要改进的一个地方。
八.软件维护
在软件开发完成交付用户使用后,就进入了软件运行/维护阶段。为了保证软件在一个相当长的时期能够正常运行,对软件的维护就成为必不可少的工作了。软件维护是指在软件已经交付用户使用之后,为了改正错误或满足新的需求而进行修改软件的过程。而目前只有我们自己内测,所以维护嘛今后会在程序运行的过程中进行啦。首先我们地分析了现在相关软件的需求,主要是在网上查找相关资料,玩一些相类似的游戏。我们简单得写了一个测试计划和用例设计:根据测试计划、任务分配、功能点划分,设计合理的测试用例。我们和班上的一些同学根据测试用例的详细步骤,执行测试用例。我们对每个case记录测试的结果,有bug的在测试管理工具中编写bug记录。通过不断测试、追踪,直到被测软件达到测试需求基本要求,最后并没有重大bug,我们最后思考了一下用户体验效果和商业价值。
九.总结体会
通过这次的作业,对做一个小型的项目有了初步的了解。对于任何的项目,都要学会怎么样 编写文档,明白写文档对产品的重要性。在需求分析,最基本的要求是要知道需求是什么,项目的目标特征,完成的效果。在软件的开发和设计过程中,要先有一个明确的计划和方向,一般写的软件都不容易完成,需要在写的过程中不断学习新的知识来解决编程时候遇到的难题。另外,要学会与自己的队友沟通, 能够培养团队精神, 才能更好的完成项目。在软件开发完成后一定要做一些简单得测试,要不断检查和修改,使得项目更加完善。