结合directx3D函数库3D视角游戏(软件工程第二次作业)

来源:互联网 发布:淘宝和阿里巴巴的关系 编辑:程序博客网 时间:2024/05/01 18:40

结合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,我们最后思考了一下用户体验效果和商业价值。

九.总结体会

通过这次的作业,对做一个小型的项目有了初步的了解。对于任何的项目,都要学会怎么样编写文档,明白写文档对产品的重要性。在需求分析,最基本的要求是要知道需求是什么,项目的目标特征,完成的效果。在软件的开发和设计过程中,要先有一个明确的计划和方向,一般写的软件都不容易完成,需要在写的过程中不断学习新的知识来解决编程时候遇到的难题。另外,要学会与自己的队友沟通, 能够培养团队精神, 才能更好的完成项目。在软件开发完成后一定要做一些简单得测试,要不断检查和修改,使得项目更加完善。


0 0
原创粉丝点击