基于vc的坦克大战游戏开发论文内容摘要:

lay 的地址是一个 URL 字符串,由如下格式构成: xdirectplay:/[data string] 在不同的网络连接上,它包含发送消息方和接受方这样的元素。 DirectPlay 对象之间的通信 DirectPlay 是基于 COM 的,而各个组件管理不同的方面,例如, DirectPlay点 (peer)对象 (CLSID_DirectPlay8Peer)就是负责管理点对点游戏的。 DirectPlay 对象之间的通信就是通过组件的接口来完成的。 比如,在点对点的游戏中,当发送数据给另外的用户时,就可以使 用“ IDirectPlay8Peer::SenfTo”,DirectPlay 会发送消息到目标机器。 DirectPlay 通过很多回调函数进行联系。 在原理上,这些函数和 Windows 程序使用的回调函数一样。 游戏要执行这些回调函数,只需要在 DirectPlay 初始化期间传送回调函数指针即可。 当 DirectPlay 需要通信时,它就自动的调用回调函数,并且传回两个重要参数信息:鉴定消息类别 ID 和一个数据块指针,一般是一个结构体。 DirectPlay 大厅支持 大厅 (Lobby)主要的任务是安排角色和布置游戏。 大 厅服务器一般还有其他功能。 比如主持聊天室,发送新闻和信息,主持商业买卖等。 一个具有大厅的多人游戏,通常由 3 个部分组成:大厅服务器;大厅客户端;支持大厅的游戏。 DirectPlay 没有具体的规定大厅服务器如何工作,所以可以自行安排。 DirectPlay 提供了对大厅客户端的支持。 一个大厅客户端通过与大厅服务器连接程序进行工作,连接程序被安装到用户的系统上。 它就像一个链,连接了用户和大厅。 8 本章小结 第二章介绍了 C++特点、 DirectX 的特色,本程序的开发环境及其相关工具的原理和使用。 9 第 3 章 构建游戏窗口准备 设置 Visual C++应用程序中的头文件 当安装好的 Visual C++和 DirectX SDK 之后,需要再确认一下 Visual C++应用程序中的头文件引入路径与 Lib 文件的连接路径是否正确,这样在以后的程序设计中才不会引起 Visual C++出现功能异常或编译时找不到 Lib 文档等情况的发生。 设置引入路径的方法如下: 首先选择 Tools 菜单中的 Options 选项 这时就打开了 Options 对话框,然后在 Directories 选项卡中的 Show directories for 下拉列表框中选择 Include files 选项,并加入新路径连接到 DirectX 中的 include 目录。 如图 31 所示: 图 31 INCLUDE 引入 10 在 Show directories for 下拉列表框中选择 Library files 选项,加入新路径连接 DirectX 中的 include 路径上。 如图 32 所示: 图 32 LIB 引入 这样,我们以后就不用担心 Visual C++会出现编译程序找不到 DirectX 的 .h与 .lib 的头文件错误。 建立程序项目 这里只建立了一个单纯的 Win32 应用程序项目,因为 Visual C++的 MFC 会套入许多默认的窗口、对话框、菜单等基本组件,而在游戏设计时,这些组件根本就用不上。 建立好一个基本的 Win32 应用程序以后,再建立这个项目所属的资源文件,方法如下: 11 图 33 新建资源文件 图 34 引入头文件 12 启动 Class Wizard 以建立存放类信息的文件。 图 35 步骤 1 选择是 图 36 步骤 2 选择 OK 13 图 37 步骤 3 选择 OK 完成以上步骤就可以开始建立应用程序和窗口了。 本章小结 本章主要讲了,如何开始建立游戏项目,其中包括许多准备工作,包括 DirectX的引入和资源文件的引入。 14 第 4 章 程序结构思想和相关技术 程序流程 本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。 在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。 用户控制的坦克运行在主线程中,随屏 幕刷新的频率而步进。 敌方坦克将在游戏开始时逐渐新增线程,每增加一个敌方对象就新增加一条线程,一旦线程数满到最大值,就不允许敌人再继续出现。 用户坦克自诞生之时起将拥有一发子弹,子弹虽然开在单独的线程中,但运行结束后并不结束子弹对象,只是将其线程终止。 用户再次发射子弹时只是将终止的线程再次激活。 在屏幕重绘的主程序中,将在每次的循环中判断若干事件。 如:用户坦克的生命是否已完全用尽,敌方坦克数是否已经为零,屏幕上的坦克数量是否少于仍剩下的坦克数量等。 以便程序进入相关的分支执行相关的反应代码,结束游戏等。 主程序流程如 图 41 所示: 系统框架设计 在这个游戏中,有 11 个核心的类。 这些类构成了游戏的框架。 Class CBonus Class CBore Class CBullet Class CDirectInput Class CEnemy Class CExplode Class CGame Class CPlane Class CPlayer Class CSprite 主程序 屏幕绘图 进入下一关 显示GameOver 开始 敌方需要出坦克时,生成坦克 初始化参数 游戏结束条件时 敌人都死亡时 图 41 本程序的主流程图 结束游戏 15 Class CTank 其中 CDirectInput 是 DirectX 中提供的类。 CBonus, CBore, CBullet, CExplode 类都继承了 CSprite 类,主要来完成对奖赏宝物 ,子弹等的绘制。 CTank 类继承了 CBullet 类,完成对坦克的控制。 CPlayer 类继承了 CTank 类,完成对玩家坦克的控制。 CEnemy 类继承了 CTank 类,完成对敌人坦克的控制。 CPlane 类完成对地图的绘制工作。 CDirectInput 类完成玩家操纵杆的设置。 程序分析和具体实现 游戏进入前的选择 当游戏启动时首先载入画面的不是游戏运行状态,而是提供选项,单人游戏还是双人游戏。 当选好以后按 Enter 键才正式开始 游戏。 如图 42 图 42 游戏载入界面 进入游戏就从第一个关卡开始,如图 43 16 主游戏逻辑及其涉及到的若干类 CGame 类主管着所有类之间的协调,决定何时死亡,何时分配新的敌人,及控制敌人出现、游戏结束后的“ Game over”字样。 其主逻辑如图 44 所示。 程序中建立了另外的两个类,分别表述了敌人坦克和玩家坦克的功能。 它们分别为: CEnemy 和 CPlayer。 这两个类均在 CGame 中建立了对象,以便进行统一调度。 其他,还需保存的变量有 ,敌人的总数、屏幕上敌人的数量、下一个敌人需要出现的位置(总共允许在五个不同的位置出现)、游戏是否一成功结束或是否已死亡。 游戏界面的绘制,通过 DrawWord()函数来把界面分割成上、下、左、右、中间这么五块,具体实现的代码如下: RECT rc。 = OFFSETX。 = + 416。 = OFFSETY。 = + 416。 DDClear( amp。 rc, 0x0 )。 // 画窗口的中间 图 43 游戏第一关界面 17 = 0。 = SCREEN_W。 = 0。 = OFFSETY。 DDClear( amp。 rc, m_dwFillColor )。 // 画窗口的上部 = OFFSETY + 416。 = SCREEN_H。 DDClear( amp。 rc, m_dwFillColor )。 //画窗口下部 = 0。 = OFFSETX。 = OFFSETY。 = + 416。 DDClear( amp。 rc, m_dwFillColor )。 //画窗口的左部 = OFFSETX + 416。 = SCREEN_W。 DDClear( amp。 rc, m_dwFillColor )。 //画窗口下部 地图由外部文件读入。 外部文件分别命名为 level%,利用 CPlane 类中的Creat()函数将地图文件读入程序。 通过Draw( LPDIRECTDRAWSURFACE pdds )和 DrawTree( LPDIRECTDRAWSURFACE pdds )来绘制障碍物。 由于敌人将依次出现在屏幕上,同时出现的数量应当受到控制。 本程序设置为 4 或 6。 (当单人模式下敌人出现在屏幕上的最大数量为 4,当在双人模式下敌人出现在屏幕上的最大数量为 6)。 构造坦克时,将坦克的图片作为参数传递给 CEnemy 和 CPlayer。 当敌人坦克完全死亡时,进入下一关时,许多变量需要重新被初始化,如地开始 敌人数量小于 0 吗。 最后一关或死亡了吗。 进入下一关 敌人数量大于屏幕上的数量吗。 增加一个敌人 玩家是否死亡 显示 Game Over 结束 Y N Y N N Y Y N 图 44 CGame 类流程图 18 图的绘制、敌人出现位置的重置、敌人的数量、玩家坦克的当前位置。 如果玩家已经死亡,将“ Game Over”字样插入到最上层,以免被其他物体覆盖。 效果如图 45 所示。 在检测用户输入的 ProcessInput ()函数中,当按方向键时,玩家坦克就将向不同的方向运行,这调用了 CTank 的 Move()函数;当开炮时,就调用其 Fire()函数,作出相应的行为。 图 45 GameOver 字样 宝物的种类 宝物种类通过一个枚举类型 enum 罗列。 enum BONUS { BONUS_LIFE,//如图 46 BONUS_CLOCK,//如图 47 BONUS_SHOVEL,//如图 48 BONUS_BOMB,//如图 49 BONUS_STAR,//如图 410 BONUS_HELMET//如图 411 }。 19 图 46 坦克 图 47 时钟 图 48 铁锹 图 49 五角星 图 410 炸弹 图 411 帽子 坦克的共同行为 在 CTank 中定义了所有坦克 (包括敌方坦克和玩家坦克 )的共同行为和属性。 CEnemy 和 CPlayer 都继承了该类以简 化结构。 在 ChangeDirection ()中定义了坦克四个方向。 构造函数中创建了每个坦克必须拥有的一颗子弹,这些子弹就将只跟随自己的坦克调动。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。