二d赛车游戏的设计与实现毕业设计(编辑修改稿)内容摘要:
移变化得出当前的位置坐标,并进行越界检测,若赛车超出世界范围,则强制将赛车位置约束在范围之内。 ( 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, 计算机信息工程学院毕业设计说明书 11 }。 赛道在游戏世界里的排列如图 23 所示。 图 23 赛道显示图 由图中可以看到有些位图完全在窗口内,有些完全在窗口外,有些部分在窗口内,有两种方法可以将位图绘制在后备缓冲表面,下面是 两种方法: 第一种方法:可以将所有位图直接绘制在后备缓冲表面,赛道对象为 road,这是一个 BOB 对象,其中存储了 10 张赛道位图,可遍历字符数组,因为每张图在世界中的坐标可以算出,都为 200 的倍数,在由世界坐标算出他在窗口的坐标,之后,调用Draw_BOB( amp。 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)检测摩擦力 计算机信息工程学院毕业设计说明书 12 路面摩擦力为 ,草地摩擦力为 ,并且,当赛车在草地行驶时,摩擦力会达到 ,所以在路面行驶的加速度会比草地的加速度大,而且,路面速度的最大值比草地的最大值要大,实际行驶时,在路面行如风,而在草地则非常慢,这是为了不让玩家从草地走。 ( 7)绘制各种物体以及赛车 这一部分十分简单,就是调用 Draw_BOB 将地图上的各个物体绘制上去, 包括终点、赛车、红绿灯,这些物体都要先计算在窗口的位置,之后绘制。 ( 8)判断胜负 本游戏的胜负判断一定要依次通过地图上的 6个区域,这是为了让玩家走完全程 ,因为此赛车游戏的赛道是一个环状赛道,所以,终点也是起点,胜负判断也是判断谁先走完一圈,其中,终点与起点的判别是一样的,而其余四种则是判断是否走过赛道的四个角落,这四种的判别十分容易,这里不做说明,由于赛车可以绕过起点线,在草地上行驶,所以要判断赛车是向上穿过终点或起点,判断穿过只需判断赛车中心进入终点,而要确保赛车向上穿过可以同时判断赛车此时的方向是否向 上。 当赛车依次通过这 6 个区域,就将当时赛车的排名记录下来,保存在此时的赛车对象里,当有三辆赛车经过终点,则将 game_type 赋值 GAME_TYPE_WIN,进入游戏胜利模块。 多人游戏逻辑 多人游戏的实现是靠 Socket 网络编程实现的,它分为服务器端和客户端,这两个的游戏逻辑不一样。 主要的游戏数据处理都在服务器端进行,并且进行发送数据和显示等操作,而客户端则接收数据并发送用户所控制的赛车的引擎状态和方向变化等信息。 多人游戏服务器端逻辑 多人游戏服务器端流程如图 24所示。 图 24 多人游戏服务器端流程 各个模块的功能如下 : 计算机信息工程学院毕业设计说明书 13 创建线程 创建一个主线程,用来对 Socket 的设置,创建其他线程用来接收或发送数据。 链接界面 这部分是显示当前链接上的玩家,在屏幕上显示 player x in,并不断地发送给相应玩家对应的赛车号码,若检测到有玩家链接,则将下一个赛车控制权转交到新连接的玩家手中,直到服务器端玩家按下回车键,之后向所有玩家发出游戏开始信号,客户端接收到信号后开始游戏。 游戏进行 此部分与单人游戏相似,详情可以参照图 25,不同之处在两处,下面是不同之处: ( 1)在检测摩 擦力之后进行的是发送数据,将各个玩家控制的赛车数据发给相应玩家,如赛车的车号、坐标、引擎状态、方向。 ( 2)在判断胜负部分里,当有赛车走完一圈时,向所有玩家发送这辆赛车的车号以及名次,当有三辆赛车到达终点时,向所有玩家发送游戏结束信号。 图 25 服务器端游戏运行流程 计算机信息工程学院毕业设计说明书 14 多人游戏客户端逻辑 客户端的游戏流程与服务器端类似,可参见图 24,但具体实现上有很大差别,下面是客户端各个模块的功能: 创建线程 创建一个主线程,用来对 Socket 的设置,用来接收或发送数据。 链接界面 这部分是显示当 前链接上的玩家的状态,如果连接上在屏幕上显示 player x in,如果没有链接上,就不显示。 游戏进行 这一部分只依次进行判断准备、接收输入信号、赛车数据处理、移动窗口、发送数据和绘图,其中移动窗口是以当前玩家所控制的赛车为主视角,赛车数据处理只进行赛车声音以及方向的处理,胜负判断是依据服务器发送过来的信号进行的。 具体流程如图 26 所示。 图 26 客户端游戏运行流程 显示游戏胜利 当游戏判断结束时,游戏将执行这部分,此部分执行时,游戏画面 将不动,并在画面上打出信息。 第一行根据不同的名次打出不同的信息,如果是第一名将显示 Y O U 判断准备 赛车数据处理 移动窗口位置 绘制赛道 绘制各种物体以及赛车 判断胜负 发送数据 计算机信息工程学院毕业设计说明书 15 W I N字样,而第 3 名显示具体的名次,如“ N U M 2”,如果是第四名则显示“ Y O U f A I L”字样。 第二行打出“ PRESS ESCAPE”,按下 Escape 键,则进入菜单选择界面,并将游戏数据初始化。 本章小结 本章主要介绍了赛车游戏的游戏逻辑,其中包含好几个部分,如单人游戏逻辑和多人游戏逻辑,游戏逻辑至关重要,因为它将具体实现游戏各个方面的内容,如具体的图 片绘制以及绘制顺序、胜负判别等等,游戏逻辑是运用游戏引擎提供的一些方法并将其有序的组织起来来具体实现游戏的。 计算机信息工程学院毕业设计说明书 16 第四章 赛车碰撞检测技术 碰撞检测是赛车游戏设计中最关键的一项技术,一个好的碰撞检测往往会使游戏变得更真实,而粗略的碰撞算法会出现许多 bug 使玩家无法玩下去。 在此毕业设计所实现的赛车游戏中,涉及到的碰撞检测共有两种,第一种是边界矩形盒方法,第二种是颜色识别算法,下面将分别介绍。 边界矩形盒方法 边界矩形盒方法是检测两个矩形是否重叠的方法,矩形可以代表任何东西,在这里代表赛车,你必须给出他们的 左上角坐标以及高度和宽度,如果有重叠,则返回 TRUE,否则返回 FALSE。 下面是它的代码: int Collision_Test(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) { // this function tests if the two rects overlap // get the radi of each rect int width1 = (w11) (w13)。 int height1 = (h11) (h13)。 int width2 = (w21) (w23)。 int height2 = (h21) (h23)。 // pute center of each rect int cx1 = x1 + width1。 int cy1 = y1 + height1。 int cx2 = x2 + width2。 int cy2 = y2 + height2。 // pute deltas int dx = abs(cx2 cx1)。 int dy = abs(cy2 cy1)。 // abs()是取绝对值 // test if rects overlap if (dx (width1+width2) amp。 amp。 dy (height1+height2)) return(1)。 else // else no collision return(0)。 } // end Collision_Test 计算机信息工程学院毕业设计说明书 17 这个函数实现的基本思想是分别计算两个矩形的中心坐标,然后根据中心坐标的 x和 y 轴的距离判断两个矩形是否重叠。 如果两个矩形相交,如图 31 所示。 图 31 两矩形相交 设这两个矩形的各个数据和函数的参数一样,顶点坐标为( x1,y1)和 (x2,y2),矩形 1 的宽为 w1,高为 h1,矩形 2 的宽为 w2,高为 h2,那么两矩形的中点坐标为(x1+w1/2,y1+h1/2),(x2+w2/2,y2+h2/2),因为这两个矩形相交,所以,他们的中点坐标必有如下关系: |x1+w1/2(x2+w2/2)|(w1+w2)/2 并且 |y1+h1/2(y2+h2/2)|(h1+h2)/2。 这里必须注意,在这个矩形重叠判断算法中,判断方法并不是 本系统 所 使用 的方法 ,形式如下。 int width1 = (w11) (w13)。 int height1 = (h11) (h13)。 int width2 = (w21) (w23)。 int height2 = (h21) (h23)。 其中, width1 为八分之三 w1,并不是本系统 所用的二分之一,这是因为此函数通常用于位图的碰撞检测,而位图是以长方形载入的,且物体的图像通常在长方形的中央,但不会占满整个长方形,如图 32 所示, X Y 矩 形1 矩形 2 计算机信息工程学院毕业设计说明书 18 图 32 赛车位图资源 赛车实体与 矩形是有区别的,虽然 本系统所列的判别方法可以准确判断矩形重叠,但当 判断重叠时,屏幕上所显示的物体并没有发生碰撞,而上述函数所用的方法虽然不准确(实际矩形重叠但检测不出来),但在游戏运行时,实际看上去效果会好很多,也更加真实,所以用八分之三比用二分之一要好。 还有一点“ (w11) (w13)”就是 w1*3/8,但为什么要这么麻烦呢。 这主要是考虑到执行速度,位移与加减法比做乘除法要快的多,游戏要考虑到速率,所以,尽量用快速的方法。 颜色识别算法 颜色识别算法在此游戏中被频繁用到,这是一个非常好 用的算法,它没有非常复杂的原理,只是读出颜色值,然后进行判别,它的速度也很快,对在窗口内的碰撞检测十分有效,下面是它的具体实现: int Color_Scan(int x1, int y1, int x2, int y2, UCHAR scan_start, UCHAR scan_end, UCHAR *scan_buffer, int scan_lpitch) { // this function implements a crude collision technique // based on scanning for a range of colors within a rectangle if (x1 = screen_width) x1=screen_width1。 else if (x1 0) x1=0。 if (x2 = screen_width) x2=screen_width1。 计算机信息工程学院毕业设计说明书 19 else if (x2 0) x2=0。 // now ycoords if (y1 = screen_height) y1=screen_height1。 else if。二d赛车游戏的设计与实现毕业设计(编辑修改稿)
相关推荐
,可以有效的减少减速装置的使用与设计,而且还可以满足功率要求。 因此本设计采用交流伺服电动机。 控制系统设计 控制对象的描述 数控激光加工机工作台运动控制主要是工作台在 X, Y, Z 三轴方向的进给运动以及围绕 Z轴的回转运动。 由于设计要求是实 现二维联动而不是同时运动,所以不能用传统的数控工作台的控制系统方式,但是传统控制系统 经过改造,就可以实现要求。
求解方程组可得函数 ),( yxf 的驻点 ),3,2,1)(,( iyxp iii ,因为驻点 ),3,2,1)(,( iyxp iii 不一定都是 ),( yxf 的极值点 ,所以还要对驻点进行判别 ,令 ),(39。 39。 39。 39。 iixxxx yxfZA , ),(39。 39。 39。 39。 iixyxy yxfZB ),(39。 39。 39。 39。
层民用建筑设计防火规范》规定:本建筑为一类高层建筑,耐火等级为一级,室外消火栓用水量为 30L/s,需设置 4 个消火栓,室外消防给水管道布置成环状,消火栓均采用地下式,统一型号均为 ,而水泵接合器需 2 个,每个消火栓的用水量为 10~ 15L/s。 室外消火栓距该建筑外墙的距离不小于 m,并不大于 40 m,距路边的距离不大于 m。 由于市政给水管不能满足消防用水量,本高层建筑需设 消防水池
难抉择,这个时候引发的恶性竞争就会严重影响事务所的审计质量。 在市场经济条件下,任何一种产品或者劳务价格都取决于该种产品或劳务的供需情况。 会计师事务所为了在竞争激烈的市场中可以承接审计业务,可能会在审计意见上做出让步,影响审计质量。 (三)衡量审计质量的指标从国外的研究来看,事务所规模对审计人员的独立性和审计质量都有很大的影响。 规模大的事务所独立性更强,更会注意自己的声誉
达不到保质的要求。 如在该类食品中添加 — ,就可以解决上述问题。 在香基香料领域的应用 在香基香料 加工中, Nisin 可降低灭菌温度,减少灭菌时间 ,能有效杀死或抑制产品中各种有害微生物,如对细菌、大肠杆菌、革兰氏阴性菌、李斯特氏菌等都有较强的抑制作用,延长产品保质期,提高产品品质。 在膏状香精中添加 、 的纳他霉素和山梨酸钾可抑制其中的各种有害微生物的生长。 在化妆品领域的应用 10
单片机内有定时 /计数器 T0 和 T1。 它们是 16 位的计数器,即可用于定时,也可用来对片外脉冲计数, T1 还可作为串行口的选择波特率发生器,这些功能都可通过软件来设定或修改。 五、以时钟控制为核心的控制器 单片机执行指令时,首先按 PC 所提供的地址从程序存储器中取出指令码,对该指令码进行译码,产生一系列的定时控制的微操作,送到单片机各部分,控制整个单片机的运行。