基于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 ()中定义了坦克四个方向。 构造函数中创建了每个坦克必须拥有的一颗子弹,这些子弹就将只跟随自己的坦克调动。基于vc的坦克大战游戏开发论文
相关推荐
ument()来获取其所对应的 Document 文档数据。 (三)文挡操作 由于 MFC 机制设计出文档类对象专门负责数据的 I/O 存取和数据的运算和操作等。 一般来说 ,数据运算是通过 Document 类里面的扩展功能来实现的 ,这样做可以 形成一种密集数据处理 ,达到方便易用和管理的好处。 对于一个文件而言 ,如果文件内对象的排列顺序是固定的
略 学术刊物文献 序号 └─┘ 作者.文章名.学术刊物名.年,卷(期):引用部分起止页 学术会议文献 序号 └─┘ 作者.文章名.编者名.会议名称,会议地址,年份.出版地,出版者, 出版年 :引用部分起止页 学位论文类参考文献 序号 └─┘ 研究生名.学位论文 题目.出版地.学校(或研究单位)及学位论文级别.答 辩年份 :引用部分起止页 西文文献中第一个词和每个实词的第一个字母大写,余者小写
0]c lk _s c anSE G[ 7. .0]D IP[ 7. .0]BC D 7ins t18 12 2. 各个模块的作用 ( 1) BCD7 模块: 输入 licheng信号和 money 信号转换成相应的七段数码管数据信号和地址信号输出 ( 2) C47 模块: 输入 second 数据信号、 minute 数据信号和 hour 数据信号转换成相应的七段数码管数据信号和地址信号输出
要求来产生计费,本设计重点就在计费控制模式模块和计费模块这两大模块的设计,则 根据出租车计费器的工作过程, 其主要原理框图如图 13 所示。 本系统采用分层次、分模块的方式设计,其本系统组成框图如下所示。 其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。 . .
要,因此选择合适的语言进行算法的描述显得尤为重要。 本文选择 Visual C++,其主要优势在于以下三个方面: ( 1)执行效率高。 C++的执行代码经过编译后生成的是汇编语言,它可以直接在处理器上运行,因此它的执行效率较高。 ( 2)较高的灵活度。 指针是 C++的一种特殊的数据类型,能够获取和直接操纵地址,实现动态存储分配内存。 掌握指针就能更有效地使用内存空间, C++中指 8 针的使用
83。 26 参考文献 27 附录 29 附录 1 中文概述 29 附录 2 译文 33 本科毕业设计(论文) 1 绪 论 温度与人们的生存生活生产息息相关 .从古人类的烧火取暖 ,到今天的工业温度控制 ,处处都体现了温度控制 . 温度是工业生产中常见的工艺参数之一 ,任何物理变化和化学反应过程都与温度密切相关 .在科学研究和生产实践的诸多领 域中 ,温度控制占有着极为重要的地位 ,特别是在冶金