二D赛车游戏的设计与实现Word格式.docx
《二D赛车游戏的设计与实现Word格式.docx》由会员分享,可在线阅读,更多相关《二D赛车游戏的设计与实现Word格式.docx(32页珍藏版)》请在冰豆网上搜索。
一开始主要依靠国外代理,而现在自主研发的游戏已经占了大部分的市场份额,现在的游戏产业,在中国的经济发展中发挥着不可替代的作用。
随着国际国内的游戏产业的发展,三维游戏逐渐成为游戏市场中的主要形式,但2D游戏因为自己的独特的优点并没有退出人们的视野,反而在网页游戏、娱乐休闲游戏等领域快速的发展。
和欧美、日韩游戏产业发展比较成熟的国家相比,中国的3D技术并不成熟,很多游戏公司的精力主要放在技术方面的处理,想尽量模仿国外优秀游戏的处理技术,而且3D游戏的投资比较大,只有一小部分大型公司有实力进行开发。
与此相对的是,因为2D游戏的技术处理难度比较低,游戏公司不仅可以将精力放在技术处理方面,还可以多花些精力在游戏策划方面,以丰富游戏的内容,它的整体开发周期短,投入的资金少得多,这些优点使得2D游戏非常适合在中国发展。
从中国游戏玩家的反应来看,3D游戏的吸引力比2D游戏强的多,玩家都更加喜欢画面质量优秀的游戏。
大多数2D游戏通常比较轻松、休闲、操作难度低,并且对硬件和系统没什么要求,非常适合那些喜欢休闲娱乐、交友的人。
现在的2D游戏中也利用不少的3D处理技术来优化游戏画面,如粒子系统、水波特效、爆炸特效等。
所以,中国的2D游戏还是有比较好的发展前途的,尤其是在手机游戏中,在电脑游戏里也不会被取代,因此,2D游戏的开发是我们值得关注和研究的问题。
1.2赛车游戏开发环境和语言
本设计所用的语言是C语言实现的,软件使用的是VC++6.0,还要Directx8.0。
DirectX是微软公司开发的基于Windows系统的多媒体编程接口,编写的语言是C++,并且遵循COM。
它可以提高在window平台运行的游戏或者多媒体程序的运行速度,有很强的3D图像处理能力,并且支持2D/3D图形加速。
使得开发人员在创建3D场景时不需要考虑硬件的类型,只需要通过Direct3D调用设备接口就可以操作图形设备,简化了游戏开发难度。
1.3赛车游戏的主要功能
本设计可实现较真实的游戏音效、键盘接口、局域网内通信等功能。
所设计的游戏可以进行两种类型的游戏即单人和多人游戏,游戏包括赛车创建、赛道载入、碰撞检测、控制在跑赛车、赛车数据处理。
单人游戏中有电脑控制的赛车可以与玩家进行赛车,多人游戏是可以各自控制赛车,在不同的赛道上有不同的速度,第一个到终点胜利。
编译通过或找出查出的问题,进行最终调试,完成游戏。
1.4赛车游戏开发的主要步骤
本游戏利用现在比较常用的VisualC++6.0工具,基于DirectX8.0,用C语言实现,进行系统的分析,从玩家的角度去思考,怎么实现开赛车时的快感与激情。
实现赛车的控制、赛道载入、碰撞检测、赛车数据处理和多人游戏等。
主要步骤为:
(1)设计并画游戏的场景;
(2)设计界面;
(3)游戏逻辑的设计与实现;
(4)游戏功能模块设计与实现;
(5)游戏测试;
第二章DirectX、游戏引擎和游戏结构
DirectX是PC平台上开发游戏的事实上的标准,而游戏引擎能使开发游戏的工作量大大的减少,本毕业设计所使用的游戏引擎是在Directx8.0上编写的。
下面是Directx8.0、游戏引擎的一些介绍。
2.1DirectX概述
Microsoft公司的DirectX是一个多媒体应用编程接口,它实际上是一种软件系统,抽象出音频、输入、视频、网络以及安装等内容,由C++语言实现,遵循COM(组件对象模型)。
你可以使用相同的代码,而不管计算机的具体硬件配置怎么样。
另外,DirectX比Windows系统自带的GDI要快很多,而且系统更稳定。
DirectX的主要组件有DirectDraw、DirectGraphic、DirectInput、DirectPlay、DirectMusic和DirectSound。
不同的API负责完成DirectX内核中不同的功能。
DirectX中的每个API都可以通过硬件加速。
这意味着只要是DirectX支持的硬件,都可以用程序访问到,而不用关心它的具体实现。
下面是它的主要组件和功能:
DirectDraw:
主要负责2D图像加速,所有图像的绘制都要用到它,因此它是十分重要的。
在8.0之后的版本已没有了。
DirectGraphic:
主要负责向屏幕上渲染二维图形和三维图形。
它实际是DirectDraw和Direct3D合并起来的。
DirectInput:
它可以直接使用所有与计算机关联的输入设备。
这些设备包括键盘、鼠标、游戏控制杆、操作杆、空间定位球等设备。
重要的是,DirectInput可以和所有现在的或将来的输入设备对话。
DirectPlay:
可以通过因特网、调制解调器或直接连接来建立抽象的连接。
DirectMusic:
支持MIDI。
DirectSound:
声音组件,支持数字化声音(WAV),但不支持MIDI。
DirectX目前已经发展到到DirectX12,一开始,DirectX1很不成功,当到了DirectX8时,它引发了显卡革命,引入像素渲染概念。
DirectX11增加了新的计算shader技术,它允许GPU从事更多的计算工作,而不仅是3D运算,这可以将GPU作为并行处理器使用。
DirectX11还支持tessellation镶嵌化技术,这有助于开发人员创建更为细腻流畅的模型,实现高质量实时渲染和预渲染场景。
DirectX11另外一大亮点是可以更好地利用多线程资源,从而使游戏更有效地利用多核处理器。
目前,已更新到DirectX12,毫无疑问DirectX给游戏业带来了巨大的发展。
2.2游戏引擎
游戏引擎是游戏中与游戏具体实现无关的核心技术部分,可以说是游戏的心脏,而游戏的部分就是场景模型、角色模型、动画、声音等其他控制部分。
经过几十年不断的发展,现在的游戏引擎已经发展成一个由多个子系统共同构成的复杂系统。
游戏引擎就是为了降低游戏开发者们重复劳动,节省开发时间和开发费用而诞生的,它封装了很多在游戏制作中常用的功能,让我们能直接调用这些功能而不用再从头编写。
下面是游戏引擎主要的结构。
2.2.1选用的游戏引擎结构
毕业设计所设计的赛车游戏中所使用的的游戏引擎由3个库函数组成:
T3DLIB1、T3DLIB2、T3DLIB3。
1、T3DLIB1:
这是一个相当简单的二维8/16位色,并具有后备缓冲的Directx引擎,支持任何分辨率,并且不在意是否为窗口模式。
主要包含:
(1)Direct接口函数如:
DDraw_Init(intwidth,intheight,intbpp,intwindowed=0):
启动并初始化DirectDraw,可以选择任何分辨率和颜色色深,windowed为0表示全屏,若想为窗口模式,应置1,并且不可选择分辨率和颜色深度。
DDraw_Shutdown(void):
关闭Directdraw并释放所有接口。
DDraw_Attach_Clipper()给发送的表面关联一个裁剪器等等。
(2)2D多边形函数
包含点、线、多边形的绘制以及绘制GDI文字等。
(3)数学和误差函数
包含计算两点间的距离、打开误差文件等。
(4)位图函数
包括加载位图函数、释放位图函数、创建内存位图、绘制位图等
(5)调色板函数
这些函数只用于256色,即8位模式,包含读取调色板函数、更新调色板、保存调色板等。
(6)实用工具函数
如Get_Clock()、Start_Clock()等时间函数以及矩形碰撞检测和颜色检测函数。
(7)BOB对象(类似精灵)及其处理函数
包含对BOB操作的各种函数。
2、T3DLIB2:
输入系统。
此系统比较简单主要功能如下:
(1)初始化DirectInput系统。
(2)设置并获取键盘、鼠标、游戏杆。
(3)从输入设备中读取数据。
(4)关闭设备。
3、T3DLIB3:
声音控制。
包含DirectSound和DirectMusic:
(1)DirectSound实现.wav格式的波形声音数据的播放控制,它的API封装功能如下:
·
DirectSound的初始化及关闭。
用11kHz、8声道载入.WAV文件。
播放加载的声音文件。
停止播放。
检测声音的播放状态。
改变音量、回放速率或立体声的声道平衡。
删除声音数据。
(2)DirectMusic实现MIDI文件的播放控制,其API封装功能如下:
DirectMusic的初始化及关闭。
加载MIDI文件。
播放MIDI文件。
停止正在播放的MIDI文件。
检测声音播放状态。
如果DirectSound已被初始化,则自动连接DirectSound。
删除MIDI。
2.3游戏结构
所有的游戏本质上是一个持续不断的while循环,它执行逻辑并在屏幕上不间断的绘制更新图像,通常以30~60帧每秒速度不断的绘制,本设计所实现的赛车游戏也是如此,但图像是以30帧每秒的速度绘制。
本设计所实现的赛车游戏流程如图2-1,下面是游戏的每个子流程的说明。
图2-1游戏程序流程图
(1)Game_Init()初始化
在这一部分中,游戏执行初始化操作,此赛车游戏主要的初始化工作有对三角函数、DirectDraw、DirectSound、DirectInput的初始化、键盘的初始化、声音的载入、创建裁剪器、游戏开始画面载入与绘制、各个位图(包括赛车、终点、赛道、指示灯、菜单画面)的载入。
(2)Game_main()
这一部分是游戏的主要部分,包括获取玩家的输入信息、执行人工智能、游戏逻辑、绘制。
(3)Game_Shutdown()
此部分是在退出游戏循环后执行的,用来释放资源。
先释放各种位图资源(如赛车、终点、指示灯等),再将DirectDraw对象释放掉,这两个的顺序不能搞错,删除所有声音,释放DirectSound对象,释放键盘设备。
2.4本章小结
本章主要介绍了DirectX8.0、游戏引擎和游戏基本结构。
在列举的Directx8.0的主要组件中,DirectDraw、DirectInput、DirectMusic和DirectSound是和本毕业设计所设计的游戏相关的,并且是选用的游戏引擎的基础。
所列出的游戏引擎中的功能模块是本毕业设计主要用到的,是实际编写过程中必须要调用的部分。
本设计的游戏的基本结构与其他游戏类似,本质上就是一个持续不断的while循环,它执行逻辑,并根据逻辑计算出下一帧图像,并在屏幕上不间断的绘制更新图像。
游戏最终表现出来的就是一帧又一帧连续的画面,本设计所要做的就是在循环中,不断的获取键盘的输入,根据输入执行游戏逻辑,生成下一个游戏动画帧,最后渲染该动画帧。
第三章游戏逻辑
3.1游戏主逻辑
游戏主逻辑如图2—1所示。
图2—1游戏主逻辑流程图
开始时钟,将后备缓冲填充黑色,依据game_state的值选择相应的功能,game_state值类型有GAME_STATE_INIT(初始状态)、GAME_STATE_MENU(菜单选择)、GAME_STATE_RUNNING(游戏进行)、GAME_STATE_EXIT(退出)、GAME_STATE_WAIT_EXIT(等待退出)。
如果game_state为GAME_STATE_INIT为游戏初始状态,停止准备音乐,将game_state置GAME_STATE_MENU,并重置游戏数据,进入菜单选择界面,读取键盘键值,上、下移动箭头,Enter为确认选择,若为单人游戏或多人游戏则将当前状态置为GAME_STATE_RUNNING,将游戏种类置为当前值,退出选项与Escape键为退出,当为可识别键时,播放按键音,然后将菜单选择界面与箭头绘制在后备缓冲表面,换页,并等待100毫秒,等待时间不宜太短,否则会出现连击的现象。
当game_state为GAME_STATE_RUNNING时为游戏进行时,之后判断game_type的值,GAME_TYPE_SINGLEPLAYER为单人模式,GAME_TYPE_MULTIPLAYER为多人游戏,GAME_TYPE_WIN为胜利状态,换页,并等待30ms。
期间如果检测到Escape键,则将game_state置为GAME_STATE_MENU,并重置游戏数据。
当game_state为GAME_STATE_EXIT为游戏退出状态,则将game_state置GAME_STATE_WAIT_EXIT(游戏退出等待状态),发送消息WM_DESTROY,之后将进入退出等待阶段,期间游戏不进行操作,等待退出。
3.2单人游戏逻辑
单人游戏的总的游戏逻辑如图2-2所示。
图2-2单人游戏流程图
具体模块如下:
(1)判断准备
判断gameready是否为3,若为3,则读取键值,若不为3,将当前的gameready的值赋给指示灯当前动画帧light.curr_frame,等待一秒钟,播放准备声音,gameready自加,并将0号车的状态改为玩家状态。
之后对读取的键值进行相应的操作,上键为打开引擎前进,左键与右键改变方向。
(2)赛车数据处理
这一部分是关键部分,决定了赛车的具体位置、引擎声音以及各种状态。
赛车是BOB对象,本部分分别对各个对象进行数据处理。
首先对按键所产生的信号和AI所产生的信号进行处理,无论信号是来自接受来自输入或AI算法,他们对赛车对象所产生的变化是同一种类型,所以处理时,只要根据赛车对象的内部数据执行相应的改变,如果引擎打开,则提高当前速度(不超过最大速度),并提高引擎发声频率,若引擎关闭,则减小引擎发声频率,方向向哪个方向变,则将相应的加或减相应的方向数值。
第二步算出赛车在X和Y方向上这一帧的位移变化,进行碰撞检测,因为赛车之间只能进行一次检测,所以,将当前赛车与之后的赛车进行碰撞检测,若检测到碰撞,则将位移大的赛车减小位移,将位移小的增加位移,之后重新算出赛车的速度以及方向,查三角函数表,找出与赛车实际方向最接近的表中方向,并将该方向值赋给赛车方向。
第三步,将赛车在世界坐标中的位置加上位移变化得出当前的位置坐标,并进行越界检测,若赛车超出世界范围,则强制将赛车位置约束在范围之内。
(3)移动窗口位置
这一部分的功能是为保证主视角以玩家控制的赛车为中心,但不超过世界范围1000×
1000。
窗口在世界中有它的坐标,窗口坐标在360×
520范围之内,不可超出此范围,当赛车超出窗口中心时,窗口坐标则移动以确保赛车在中心处,中心范围为x坐标在200到240,y坐标在160到320。
(4)绘制赛道
赛道的绘制一定要在颜色识别之前进行,不然,颜色识别将无法进行。
本游戏的赛道种类共有10种,外加一个草地,形成游戏的地形,每个位图大小为200×
200大小。
世界地形是存储在一个二维字符数组里,此字符数组内字符种类为0~9和‘g’,0~9代表各个种类的赛道,‘g’代表草地,字符数组的存储如下所示:
char*world[5]=
{
"
61117"
02g30"
0ggg0"
05g40"
91118"
};
赛道在游戏世界里的排列如图2-3所示。
图2-3赛道显示图
由图中可以看到有些位图完全在窗口内,有些完全在窗口外,有些部分在窗口内,有两种方法可以将位图绘制在后备缓冲表面,下面是两种方法:
第一种方法:
可以将所有位图直接绘制在后备缓冲表面,赛道对象为road,这是一个BOB对象,其中存储了10张赛道位图,可遍历字符数组,因为每张图在世界中的坐标可以算出,都为200的倍数,在由世界坐标算出他在窗口的坐标,之后,调用Draw_BOB(&
road,lpddsback),将位图绘制进后备缓冲表面,在这里,将重复调用road和grass对象进行绘制,因为Draw_BOB的绘制是采用DirectDraw中的blt()函数,它支持硬件加速,所以,即使绘制的位图看不见或数量多一点,也不会影响速度。
第二种方法:
因为只要位图在窗口内就要进行绘制,所以将窗口坐标对200进行整除就能得到对应的数组位置,代码如下:
x_l=view_x/200;
//左侧位图在数组的x位置
x_r=(view_x+639)/200;
//右侧位图在数组的x位置
y_t=view_y/200;
//上侧位图在数组的y位置
y_b=(view_y+479)/200;
//下侧位图在数组的y位置
然后依据上述值,将所选中的位图blt到后备缓冲表面。
(5)实行AI算法
AI算法是对所有非玩家控制的赛车进行的,首先,当gameready信号为3时,打开引擎,之后对赛车左右两边30度距离赛车中心60像素的区域进行颜色识别,若为绿色,那么将方向变化改为相反方向,最后进行边界检测。
(6)检测摩擦力
路面摩擦力为0.15,草地摩擦力为0.19,并且,当赛车在草地行驶时,摩擦力会达到0.34,所以在路面行驶的加速度会比草地的加速度大,而且,路面速度的最大值比草地的最大值要大,实际行驶时,在路面行如风,而在草地则非常慢,这是为了不让玩家从草地走。
(7)绘制各种物体以及赛车
这一部分十分简单,就是调用Draw_BOB将地图上的各个物体绘制上去,包括终点、赛车、红绿灯,这些物体都要先计算在窗口的位置,之后绘制。
(8)判断胜负
本游戏的胜负判断一定要依次通过地图上的6个区域,这是为了让玩家走完全程,因为此赛车游戏的赛道是一个环状赛道,所以,终点也是起点,胜负判断也是判断谁先走完一圈,其中,终点与起点的判别是一样的,而其余四种则是判断是否走过赛道的四个角落,这四种的判别十分容易,这里不做说明,由于赛车可以绕过起点线,在草地上行驶,所以要判断赛车是向上穿过终点或起点,判断穿过只需判断赛车中心进入终点,而要确保赛车向上穿过可以同时判断赛车此时的方向是否向上。
当赛车依次通过这6个区域,就将当时赛车的排名记录下来,保存在此时的赛车对象里,当有三辆赛车经过终点,则将game_type赋值GAME_TYPE_WIN,进入游戏胜利模块。
3.3多人游戏逻辑
多人游戏的实现是靠Socket网络编程实现的,它分为服务器端和客户端,这两个的游戏逻辑不一样。
主要的游戏数据处理都在服务器端进行,并且进行发送数据和显示等操作,而客户端则接收数据并发送用户所控制的赛车的引擎状态和方向变化等信息。
3.3.1多人游戏服务器端逻辑
多人游戏服务器端流程如图2-4所示。
图2-4多人游戏服务器端流程
各个模块的功能如下:
1、创建线程
创建一个主线程,用来对Socket的设置,创建其他线程用来接收或发送数据。
2、链接界面
这部分是显示当前链接上的玩家,在屏幕上显示playerxin,并不断地发送给相应玩家对应的赛车号码,若检测到有玩家链接,则将下一个赛车控制权转交到新连接的玩家手中,直到服务器端玩家按下回车键,之后向所有玩家发出游戏开始信号,客户端接收到信号后开始游戏。
3、游戏进行
此部分与单人游戏相似,详情可以参照图2-5,不同之处在两处,下面是不同之处:
(1)在检测摩擦力之后进行的是发送数据,将各个玩家控制的赛车数据发给相应玩家,如赛车的车号、坐标、引擎状态、方向。
(2)在判断胜负部分里,当有赛车走完一圈时,向所有玩家发送这辆赛车的车号以及名次,当有三辆赛车到达终点时,向所有玩家发送游戏结束信号。
图2-5服务器端游戏运行流程
3.3.2多人游戏客户端逻辑
客户端的游戏流程与