收藏 分销(赏)

基于VC--的坦克大战游戏开发论文.doc

上传人:仙人****88 文档编号:9150569 上传时间:2025-03-15 格式:DOC 页数:39 大小:362KB 下载积分:10 金币
下载 相关 举报
基于VC--的坦克大战游戏开发论文.doc_第1页
第1页 / 共39页
基于VC--的坦克大战游戏开发论文.doc_第2页
第2页 / 共39页


点击查看更多>>
资源描述
摘要 坦克大战是一款非常经典游戏,风靡全球,经久不衰,是学习面向对象的编程思想的理想实例。现在面向对象的计算机编程语言很多,都可以编程来实现。 本文的坦克大战有完整的界面,能够实现人机大战. 而且坦克大战游戏剧情非常简单,游戏的主角在保护好城堡的前提下,消灭所有的敌人,所以非常容易上手.但剧情简单并不代表过关简单.有鉴于以前出现的坦克大战游戏过于简单,使玩家有索然无味的感觉.这次在游戏里特别加强了难度,敌人坦克的出生地变成了5个,并且敌人也能够取得宝物,当在双人模式下,如玩家坦克被己方坦克打到时,会停在那里一些时间。本文用到了碰撞算法,以及敌人坦克的智能控制。 不同于网络上已经出现的坦克大战,本程序是用VC++编写的,拥有漂亮的人机交互界面. 本论文从以下二个方面来阐述:1.游戏的背景2.游戏的开发过程 关键词: 算法 , VC++ , 坦克大战 ABSTRACT A Battle City is very classic games, swept the globe and lasting, learning object-oriented programming thinking of the ideal example. Now a lot of the object-oriented computer programming language can be actualized. This paper Battle City complete interface to achieve human-machine war. The plot of the Battle City game is very simple. The protagonist in the game to protect the castle, under the premise of eliminating all enemies, it is easier to get started. But the plot does not mean a simple clearance simple. In view of the previous game too simple Battle City alone, the player is dull anyway. This game in particular to strengthen the degree of difficulty, enemy tanks into the birthplace of five, and the enemy could also be achieved in the collection, the double model, Players such as tanks hit by its own tanks, will stop there for some time. This paper uses a collision algorithm, the enemy tanks and intelligent control. Different from the network that have appeared Battle City, this procedure is programming by the Visual C + +, having beautiful man-machine interface. This paper from the following two aspects to elaborate : 1. Background 2. Games development process Keywords:arithmetic ,VC++ , Battle City 目录 摘要 I ABSTRACT II 第1章 绪论 1 1.1 背景 1 1.2 任天堂和Battle City背景介绍 2 1.3 研究内容 3 第2章 开发环境及相关技术的介绍 4 2.1 开发环境 4 2.2 C++特点 4 2.3 DirectX的特色 5 2.4 本章小结 8 第3章 构建游戏窗口准备 9 3.1 设置Visual C++应用程序中的头文件 9 3.2 建立程序项目 10 3.3 本章小结 13 第4章 程序结构思想和相关技术 14 4.1程序流程 14 4.2系统框架设计 14 4.3程序分析和具体实现 15 4.3.1 游戏进入前的选择 15 4.3.2 主游戏逻辑及其涉及到的若干类 16 4.3.3 宝物的种类 18 4.3.4 坦克的共同行为 19 4.3.5 玩家坦克的功能属性 20 4.3.6 敌人坦克的功能属性 22 4.3.7 子弹的运行和控制 25 4.3.8 得分与关卡的显示 27 4.3.9 DirectInput键盘 27 4.4 本章小结 32 第5章 结论 33 5.1 本程序的总结和展望 33 5.2 经验和感想 33 致谢 34 参考文献 35 - 35 - 第1章 绪论 1.1 背景 我国游戏软件业是一个新兴行业,存在着巨大的生存和发展空间,同时它也是一个存在社会争议的行业。 游戏产业准确地讲应该叫做电子娱乐业,是指基于电子技术、计算机技术、软件技术、网络技术和无线技术的新型娱乐产业,分为单机游戏、网络游戏和无线游戏等几个部分。电子游戏业从诞生至今已经有几十年的时间,可仅仅在这短短的几十年的时间里,它却在发达国家的经济发展中发挥了显著的作用。 游戏软件业从诞生到现在,历经几代的发展,已进入了一个非常成熟的时期。对于我国而言,游戏软件业也有快速的发展,但是因为很多原因阻碍了这个产业的发展,如游戏软件研发人才缺乏,软件开发投入不足;对青少年的负面影响,一些不健康的游戏软件导致了社会对游戏软件的偏见;技术滞后等情况。 坦克大战游戏是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个坦克大战时代。究其历史,坦克大战最早还是出现在PC机上,现在又重新掀起这股让人沉迷的坦克大战风潮,它的规则简单,容易上手,且游戏过程变化无穷,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。这次练习的是在Microsoft Visual C++ 6.0平台上生成坦克大战游戏。Microsoft Visual C++是一个非常好的windows软件开发程序,很多的windows平台下的软件都是把它作为辅助工具编写出来的。现在使用得比较多的是6.0版 和.NET版,不久前Microsoft还推出了Microsoft Visual Studio 2005版。随着版本的提高,Microsoft给我们提供的函数数据库也越来越方便,越来越丰富了。当完成时,觉得自己在不知不觉中已跨入了它的大门。使用Microsoft Visual C++ 6.0几乎可以做出一切东西来,从即时战略到三维RPG游戏。当然还有各种应用软件了。如果要开发出更复杂的游戏,就还需要学习更多的东西,为了提高显示速度,需要使用DirectX,为了制作3D图像,又要使用Direct3D。由于游戏的流程和内部原理很复杂,所以需要学习数据结构、图形学…… 学习这么多专业知识需要很大的努力,不过我心中有一个梦想,那么再难的目标也能实现。“千里之行,始于足下”,尤其是在迈出了坦克大战的第一步之后,实际上,已经走进了软件开发,尤其是游戏开发的大门,前面的世界是美丽多彩而又充满挑战的。 1.2 任天堂和Battle City背景介绍 图1-2 Battle City的界面 -3 Batt e ity的界面 图1-1 80年代中期 器 FC(Family Computer)主机在欧美又称Nintendo Entertainment System(可译作任天堂娱乐平台即NES)。FC主机在游戏业界造成的巨大冲击众所周知,这款主机在当时事实上几乎占领了世界各地多个国家的整个游戏市场,并使得逐渐没落的北美游戏市场再度复苏。这款主机的性能比当时的多数主机都要强大,而价格上却便宜得多。主机所采用得处理器为CMOS 6502,一款已经淘汰的70年代中期产品。由于其价格便宜且极易使用,经过任天堂的改造后又焕发了全新活力。6502 芯片cpu 主频为8 bit,12 MHz,内存8k,画面 52色,同屏最多显示其中的13色,声音2个矩波,1个三角波,1个杂音,1个PCM音频(见图1-1)。 Battle City是其发售卡带中的一款力作,设置了35个关卡,可以双人操纵,画面设置了若干种类的建筑物和阻挡物,以消灭所有敌人为通关条件,并有接宝物等增加游戏效果的设置,画面精美,音效杰出,在PC机的80386处理器仍未面世的当时,能在硬件上运行这样的2D程序不得不令人惊叹,难怪常有人说游戏程序是最大限度发挥硬件水平的载体。其游戏界面如图1-2所示。 1.3 研究内容 本文主要的研究内容包括: 敌人坦克的转向,出生点的设置,发射子弹,获得宝物后的变化; 玩家坦克的控制,操纵杆的设置,获得宝物的变化; 坦克之间的碰撞,坦克与宝物之间的碰撞,子弹之间的碰撞和子弹和坦克之间的碰撞的判断,子弹发射时间间隔的控制; 还有关卡的选择,通过page up和page down选择上一关或下一关。 本程序需解决的有关技术问题 1. 游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。 2. 己方坦克的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定其一定的智能性;同时,出现在屏幕上的敌方可能会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。Visual C++的多线程能力为实现这样的游戏提供了可能。敌人坦克的运行算法也需要进行适当的设置,以免游戏过于简单,单调。 3. 对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。敌方子弹仅需要扫描用户坦克,而用户坦克需要在每一步扫描所有的敌方坦克。这需要对所有的对象有较好的控制。另外,子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。 4. 双方的坦克在前进时也需要考虑到是否碰撞到相关物体或对方坦克,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。每一次刷新页面、每前进一步都需要将所有的周围环境都进行扫描。 5. 游戏的结束、开始、动态信息画面作为构成一个完美程序都是必不可少的重要部分。 以上相关技术细节和整体流程将分别在以下小节阐述。 第2章 开发环境及相关技术的介绍 2.1 开发环境 操作系统:Microsoft Windows XP 开发工具:Microsoft Visual C++ 6.0 DirectX 2.2 C++特点 面对对象程序设计的特点: 1. 抽象性 抽象一般是指从具体的实例中抽取出共同的性质并加以描述的过程。 2. 封装性 封装是面向对象方法的重要的原则。所谓封装,就是将一个事物包装起来,使外界不了解它的详细内情。在面向对象的方法中,把某些相关的代码和数据结合在一起,形成一个数据和操作的封装体,这个封装体向外提供一个可以控制的接口,其内部大部分的实现细节则对外隐藏,从而达到对数据访问权限的合理控制。封装可以使得程序中各部分之间的相互影响达到最小,并且提高程序的安全性,简化代码的编写工作。 3. 继承性 继承是软件复用的一种方式。通过继承,一个对象可以获得另一个对象的属性,并加入属于自己的一些特性。它提供了创建新类的一种方法,即从现有类创建新类。新类继承了现有类的属性和行为,并通过对这些属性和行为进行扩充和修改,增添自己特有的一些性质。 4. 多态性 多态性也是面向对象程序设计的重要特性之一。简单地说,多态性就是一个接口,多种方式。在基类中定义的属性和操作被派生类继承之后,可能具有不同的数据类型或表现出不同的行为,我们称之为多态性。也就是说,多态性表现为同一属性或操作在一般类及各特殊类中具有不同的语义。 C++作为一种面对对象的程序设计语言,也具有这样的特点。并且C++拥有友好的界面和强大的功能,为用户提供了一个良好的windows系统下的可视化开发环境。在该环境下,用户可以开发任何用C++或C语言编写的程序,包括程序的建立、编辑、浏览、保存、打开、编译、链接、调试和优化等。更重要的是,使用C++提供的工具、向导以及MFC类库,可以在一个很短的时间里创建一个完整的windows应用程序,并且获得大量的在线帮助。 Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。Visual C++作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。在使用Visual C++开发应用程序的过程中,系统为我们生成了大量的各种类型的文件。 Visual C++采用的框架是MFC。MFC不仅仅是人们通常理解的一个类库。你如果选择了MFC,也就选择了一种程序结构,一种编程风格。MFC 是一个很大的、扩展了的 C++ 类层次结构,它能使开发 Windows 应用程序变得更加容易。MFC 是在整个 Windows 家族中都是兼容的,也就是说,无论是 Windows3.x、Windows95 还是 Windows NT,所使用的 MFC 是兼容的。每当新的 Windows 版本出现时,MFC 也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC 也回得到扩展,添加新的特性、变得更加容易建立应用程序。 使用 MFC 的最大优点是它为你做了所有最难做的事。MFC 中包含了上成千上万行正确、优化和功能强大的 Windows 代码。你所调用的很多成员函数完成了你自己可能很难完成的工作。从这点上将,MFC 极大地加快了你的程序开发速度。 由于MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。 最后要指出的是MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性。 2.3 DirectX的特色 直接读写显存 目前的显卡上大部分都已经内置了8~32M的显存,DirectDraw 可以直接读写这些显存,并利用“切换页”的功能将图形的性能发挥得淋漓尽致。 支持硬件加速 DirectX 支持硬件的加速功能,当DirectX对象建立时,程序会自动去查询可使用的硬件,程序员就不用去考虑玩家的计算机设备。 网络联机功能 DirectPlay可以让程序员很容易的开发多人联机游戏,联机的方式可包含局域网络联机、调制解调器联机,并支持各种通信协议。 DirectDraw提供以下功能: 1、DirectDraw的硬件抽象层(HAL)提供的兼容接口可以直接操作显示硬件,从而获得最大性能。 2、DirectDraw可以评估视频硬件的性能,从而可以充分利用已有的功能。例如如果显卡支持硬件位图影射,那么DirectDraw就直接使用硬件影射,从而大大提高了性能。此外,DirectDraw提供了一种硬件模拟层(HEL)模拟硬件不支持的功能。 3、DirectDraw从操作系统所提供的32位内存寻址和平面内存模型中获益。DirectDraw将视频和系统存储器视为整块的空间,而不是碎片的集合。 4、对于全屏模式的应用程序,DirectDraw使得多后台缓存(Back buffers)的换页(Page flipping )操作变得极为容易。 5、支持窗口和全屏模式应用程序的裁剪。 6、支持3D Z-buffer。 7、支持带Z轴方向的硬件辅助覆盖。 8、可访问图象缩放(Stretching)硬件。 9、可同时访问标准的和增强的显示设备内存区。 10、其他的特性,包括动态改变调色板,独占访问硬件和分辨率切换等。 DirectPlay的特点: 1、创建和管理会话。 2、DirectPlay网络通信 DirectPlay的主要功能是使游戏和网络底层分开。如果在游戏中需要发送状态更新的消息,则可以很简单的调用DirectPlay API,而不必在意复杂的网络连接情况。DirectPlay网络服务提供了多种网络连接支持,如TCP/IP、IPX、Modem和Serial Link。 3、DirectPlay传输协议 DirectPlay的核心内容是DirectPlay协议。DirectPlay协议的重点是让程序员可以简单的发送消息。协议为多人网络游戏提供了很多量身定制的特性,包括以下几个方面:可靠和不可靠的消息传递;连续和非连续消息传递;消息分割和打包;阻塞控制;发送顺序;消息超时处理。 4、DirectPlay地址 为了传送消息,每个加入游戏的机器都要有一个唯一的地址。运行游戏客户端的电脑提供设备地址,而游戏主机将提供主机的地址。 DirectPlay的地址是一个URL字符串,由如下格式构成: x-directplay:/[data string] 在不同的网络连接上,它包含发送消息方和接受方这样的元素。 5、DirectPlay对象之间的通信 DirectPlay是基于COM的,而各个组件管理不同的方面,例如,DirectPlay点(peer)对象(CLSID_DirectPlay8Peer)就是负责管理点对点游戏的。 DirectPlay对象之间的通信就是通过组件的接口来完成的。比如,在点对点的游戏中,当发送数据给另外的用户时,就可以使用“IDirectPlay8Peer::SenfTo”,DirectPlay会发送消息到目标机器。 DirectPlay通过很多回调函数进行联系。在原理上,这些函数和Windows程序使用的回调函数一样。游戏要执行这些回调函数,只需要在DirectPlay初始化期间传送回调函数指针即可。当DirectPlay需要通信时,它就自动的调用回调函数,并且传回两个重要参数信息:鉴定消息类别ID和一个数据块指针,一般是一个结构体。 6、DirectPlay大厅支持 大厅(Lobby)主要的任务是安排角色和布置游戏。大厅服务器一般还有其他功能。比如主持聊天室,发送新闻和信息,主持商业买卖等。 一个具有大厅的多人游戏,通常由3个部分组成:大厅服务器;大厅客户端;支持大厅的游戏。 DirectPlay没有具体的规定大厅服务器如何工作,所以可以自行安排。DirectPlay提供了对大厅客户端的支持。一个大厅客户端通过与大厅服务器连接程序进行工作,连接程序被安装到用户的系统上。它就像一个链,连接了用户和大厅。 2.4 本章小结 第二章介绍了C++特点、DirectX的特色,本程序的开发环境及其相关工具的原理和使用。 第3章 构建游戏窗口准备 3.1 设置Visual C++应用程序中的头文件 当安装好的Visual C++和DirectX SDK之后,需要再确认一下Visual C++应用程序中的头文件引入路径与Lib文件的连接路径是否正确,这样在以后的程序设计中才不会引起Visual C++出现功能异常或编译时找不到Lib文档等情况的发生。设置引入路径的方法如下: 1、首先选择Tools菜单中的Options选项 2、这时就打开了Options对话框,然后在Directories选项卡中的Show directories for下拉列表框中选择Include files选项,并加入新路径连接到DirectX 中的include目录。如图3-1所示: 图3-1 INCLUDE引入 3、在Show directories for下拉列表框中选择Library files选项,加入新路径连接DirectX 中的include路径上。如图3-2所示: 图3-2 LIB引入 这样,我们以后就不用担心Visual C++会出现编译程序找不到DirectX的.h与.lib的头文件错误。 3.2 建立程序项目 这里只建立了一个单纯的Win32应用程序项目,因为Visual C++的MFC会套入许多默认的窗口、对话框、菜单等基本组件,而在游戏设计时,这些组件根本就用不上。 建立好一个基本的Win32应用程序以后,再建立这个项目所属的资源文件,方法如下: 图3-3 新建资源文件 图3-4引入头文件 启动Class Wizard以建立存放类信息的文件。 图3-5 步骤1选择是 图3-6 步骤2选择OK 图3-7步骤3选择OK 完成以上步骤就可以开始建立应用程序和窗口了。 3.3 本章小结 本章主要讲了,如何开始建立游戏项目,其中包括许多准备工作,包括DirectX的引入和资源文件的引入。 第4章 程序结构思想和相关技术 4.1 程序流程 本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。用户控制的坦克运行在主线程中,随屏幕刷新的频率而步进。敌方坦克将在游戏开始时逐渐新增线程,每增加一个敌方对象就新增加一条线程,一旦线程数满到最大值,就不允许敌人再继续出现。用户坦克自诞生之时起将拥有一发子弹,子弹虽然开在单独的线程中,但运行结束后并不结束子弹对象,只是将其线程终止。用户再次发射子弹时只是将终止的线程再次激活。在屏幕重绘的主程序中,将在每次的循环中判断若干事件。如:用户坦克的生命是否已完全用尽,敌方坦克数是否已经为零,屏幕上的坦克数量是否少于仍剩下的坦克数量等。以便程序进入相关的分支执行相关的反应代码,结束游戏等。主程序流程如图4-1所示: 主程序 屏幕绘图 进入下一关 显示GameOver 开始 敌方需要出坦克时,生成坦克 初始化参数 游戏结束条件时 敌人都死亡时 图4-1 本程序的主流程图 结束游戏 4.2 系统框架设计 在这个游戏中,有11个核心的类。这些类构成了游戏的框架。 Class CBonus Class CBore Class CBullet Class CDirectInput Class CEnemy Class CExplode Class CGame Class CPlane Class CPlayer Class CSprite Class CTank 其中 CDirectInput 是DirectX中提供的类。 CBonus,CBore,CBullet,CExplode类都继承了CSprite类,主要来完成对奖赏宝物,子弹等的绘制。 CTank类继承了CBullet类,完成对坦克的控制。 CPlayer类继承了CTank类,完成对玩家坦克的控制。 CEnemy类继承了CTank类,完成对敌人坦克的控制。 CPlane类完成对地图的绘制工作。 CDirectInput类完成玩家操纵杆的设置。 4.3 程序分析和具体实现 4.3.1 游戏进入前的选择 当游戏启动时首先载入画面的不是游戏运行状态,而是提供选项,单人游戏还是双人游戏。当选好以后按Enter键才正式开始游戏。如图4-2 图4-2 游戏载入界面 进入游戏就从第一个关卡开始,如图4-3 图4-3 游戏第一关界面 4.3.2 主游戏逻辑及其涉及到的若干类 CGame 类主管着所有类之间的协调,决定何时死亡,何时分配新的敌人,及控制敌人出现、游戏结束后的“Game over”字样。其主逻辑如图4-4所示。 程序中建立了另外的两个类,分别表述了敌人坦克和玩家坦克的功能。它们分别为:CEnemy和CPlayer。这两个类均在CGame中建立了对象,以便进行统一调度。 其他,还需保存的变量有,敌人的总数、屏幕上敌人的数量、下一个敌人需要出现的位置(总共允许在五个不同的位置出现)、游戏是否一成功结束或是否已死亡。 游戏界面的绘制,通过DrawWord()函数来把界面分割成上、下、左、右、中间这么五块,具体实现的代码如下: RECT rc; rc.left = OFFSETX; rc.right = rc.left + 416; rc.top = OFFSETY; rc.bottom = rc.top + 416; DDClear( &rc, 0x0 );// 画窗口的中间 开始 敌人数量小于0吗? 最后一关或死亡了吗? 进入下一关 敌人数量大于屏幕上的数量吗? 增加一个敌人 玩家是否死亡 显示Game Over 结束 Y N Y N N Y Y N 图4-4 CGame类流程图 rc.left = 0; rc.right = SCREEN_W; rc.top = 0; rc.bottom = OFFSETY; DDClear( &rc, m_dwFillColor );// 画窗口的上部 rc.top = OFFSETY + 416; rc.bottom = SCREEN_H; DDClear( &rc, m_dwFillColor ); //画窗口下部 rc.left = 0; rc.right = OFFSETX; rc.top = OFFSETY; rc.bottom = rc.top + 416; DDClear( &rc, m_dwFillColor ); //画窗口的左部 rc.left = OFFSETX + 416; rc.right = SCREEN_W; DDClear( &rc, m_dwFillColor ); //画窗口下部 地图由外部文件读入。外部文件分别命名为level%d.map,利用CPlane类中的Creat()函数将地图文件读入程序。通过Draw( LPDIRECTDRAWSURFACE pdds )和DrawTree( LPDIRECTDRAWSURFACE pdds )来绘制障碍物。 由于敌人将依次出现在屏幕上,同时出现的数量应当受到控制。本程序设置为4或6。(当单人模式下敌人出现在屏幕上的最大数量为4,当在双人模式下敌人出现在屏幕上的最大数量为6)。构造坦克时,将坦克的图片作为参数传递给CEnemy和CPlayer。 当敌人坦克完全死亡时,进入下一关时,许多变量需要重新被初始化,如地图的绘制、敌人出现位置的重置、敌人的数量、玩家坦克的当前位置。 如果玩家已经死亡,将“Game Over”字样插入到最上层,以免被其他物体覆盖。效果如图4-5所示。在检测用户输入的ProcessInput ()函数中,当按方向键时,玩家坦克就将向不同的方向运行,这调用了CTank的Move()函数;当开炮时,就调用其Fire()函数,作出相应的行为。 图4-5 GameOver字样 4.3.3 宝物的种类 宝物种类通过一个枚举类型enum罗列。 enum BONUS { BONUS_LIFE,//如图4-6 BONUS_CLOCK,//如图4-7 BONUS_SHOVEL,//如图4-8 BONUS_BOMB,//如图4-9 BONUS_STAR,//如图4-10 BONUS_HELMET//如图4-11 }; 图4-6 坦克 图4-7 时钟 图4-8 铁锹 图4-9 五角星 图4-10 炸弹 图4-11帽子 4.3.4 坦克的共同行为 在CTank中定义了所有坦克(包括敌方坦克和玩家坦克)的共同行为和属性。CEnemy和CPlayer都继承了该类以简化结构。在ChangeDirection ()中定义了坦克四个方向。构造函数中创建了每个坦克必须拥有的一颗子弹,这些子弹就将只跟随自己的坦克调动。 为了能提前预测碰撞,调用了HitTest( CSprite& sprite )。 在CBullet 的Move ()中,将根据坦克当前的方向确定子弹出膛后的方向,将其放置到炮口的位置。 Move()函数将返回坦克是否能够向前前进,考虑到的因素有边界,它返回一个boolean值。 if( m_x < 0 ) m_x = 0; else if( m_x + m_width > MAX_X ) m_x = MAX_X - m_width; if( m_y < 0 ) m_y = 0; else if( m_y + m_height > MAX_Y ) m_y = MAX_Y - m_height; 4.3.5 玩家坦克的功能属性 构造函数中需要将坦克方向设置为向上,因为刚出现时就是这样的状态。当开炮时,调用CBullet需要联系的还有自身坦克、地图。这些都由坦克传递给子弹。因为子弹是属于坦克的,它的属性需要跟当前的坦克保持一致。接着使用Draw()将子弹显示出来。最终开始子弹自己的线程。子弹一旦开始运行,就脱离了当前坦克的控制,直到其生命周期终止。 无论子弹是属于敌人还是玩家的,它都必须记录自己的来源和攻击的对象。在玩家坦克发射的子弹中,就必须将攻击对象设置为所有的敌人。这样,它才能有扫描的目标。 玩家获取宝物,调用HitTest( CSprite& sprite )函数判断是否和宝物相交。 if( m_player[k].HitTest( m_bonus ) ) { EatBonus( m_player[k] ); } 调用EatBonus函数来实现玩家玩家得到宝物及其变化。 void CGame::EatBonus( CPlayer& player ) { int i; switch( m_bonus.m_type ) { case BONUS_LIFE: player.m_nLife ++; break; case BONUS_CLOCK: m_bEnemyLocked = TRUE; m_lockTime = timeGetTime(); break; case BONUS_SHOVEL: m_plane.Protect(); break; case BONUS_BOMB: for( i = 0; i < m_nMaxEnemys; i ++ ) if( m_enemy[i].m_active && !m_enemy[i].m_bBoring ) { Explode( m_enemy[i], TRUE ); m_enemy[i].m_active = FALSE; m_nEnemys --; } break; case BONUS_STAR: if( ++player.m_type > 3 ) player.m_type = 3; break; case BONUS_HELMET: player.Shield( 10000 ); break; } m_bonus.m_active = FALSE; } 玩家子弹射击出弹口的位置设置。具体实现代码如下: switch( m_dir ) { case DIR_UP: m_bullet[i].m_x=m_x+m_width/2-4; m_bullet[i].m_y=m_y+4; break; case DIR_DOWN: m_bullet[i].m_x=m_x+m_width/2-4; m_bullet[i].m_y=m_y+m_height-12; break; case DIR_LEFT: m_bullet[i].m_x=m_x+4; m_bullet[i].m_y=m_y+m_height/2-4; break; case DIR_RIGHT: m_bullet[i].m_x=m_x+m_width-12; m_bullet[i].m_y=m_y+m_height/2-4; } 开始 是否刚出现 前进 Y 可否开炮 开炮 可否前进 换向.移动 结束 是否已死亡 是否碰撞 N Y N Y N Y N N 图4-12 敌方坦克运行流程 Y 4.3.6 敌人坦克的功能属性 由于和CPlayer同属于一个CTank的继承类,其功能就与CPlayer有很大的相似之处,但也有其自身的特别属性。其主要功能流程图见图4-12。 首先,CEnemy调用了随机数函数rand()。因为敌人的运行是自动的,需要有设定的程序让它可自己控制,而不像CPlayer完全通过每次输入的键盘信号来做出反映。 ChangeDirection ()调用了rand()产生一个随机的整数,此整数取除4的余数的绝对值作为随机的方向。 void CEnemy::ChangeDirection() { CTank::ChangeDirection( (DIRECTION)(rand() % 4) ); } 每个敌人还需要拥有一个内部的所有敌人的数组元素。这样,它们才可以自动检测自己是否与同伴发生了碰撞,以便采取躲避、转向等行动。 for( int j = 0; j < m_nMaxEnemys; j ++ ) { if( i != j && m_enemy[i].HitTest( m_e
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服