网站大量收购独家精品文档,联系QQ:2885784924

(飞机空战V1.1修改优化篇.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(飞机空战V1.1修改优化篇

飞机空战V1.1 二:修改优化篇 /*-----------------------------------------------------------------------------------------------------------------------------* Author: Sunsu * E-mail: 641655502@ * Date: 2013-02-01 -----------------------------------------------------------------------------------------------------------------------------*/ 前言: 前面今天已经实现飞机空战的基本对战功能,我方战机可以与敌机进行正常对战,可以设置我方战机和敌机的生命值,实现游戏难度的增加。 问题的发现: 破程序竟然占了将近27M内存,肯定要优化了。 1. 游戏运行一段时间后不能运行了,程序崩溃退出了,这是什么问题呢,很郁闷呢,仔细想想了,看了下CPlaneDoc类 原来这样,数据的存储我都是来组织的,这样就有一个大问题,数组的大小是固定的,程序一旦运行,系统就分配给数组固定大小的内存,不可以扩展,这样当敌机的数量超过了100架,或者我方战机和敌机发了超过了1000发子弹的话,数组将会溢出,出现越界访问问题,程序自然退出了。 好了,知道了问题就对症下药了,优化数据结构,换用可动态增长的数组和链表存储结构,我首先想到的是C++的库函数里的CArry类,查看了MSDN,用法还就简单,还有Example 用法还就简单,#include afxtempl.h头文件。 不用不知道,一用吓一跳,报了一大堆错,看了半天发现,貌似在使用自定义的类作为其数组元素时,类中必须有合适复制构造函数和重载的=运算符,麻烦了,还是自己封装把,自给自足,就用链表把,以前上数据结构课程时经常用,熟悉。 分析一下类需实现的功能,具有自动数组元素自动收缩功能,当一个数组元素删除时,后面的元素能自动向前缩进,可以动态增加元素,重载[]运算符,可以计算数组元素的个数, 类设计如下: 采用模版编写,增强了类的可复用性,因为需要不同类型的数组元素。 两点说明: 类设计好后,使用时编译器报了一大推莫名其妙的链接错误,编译没有问题,链接出问题了,查了查资料,由于本人采用的是VC6.0编译器,此编译器比较老,所以不支持模版分离编译,即模版类的声明和定义必须放在一个文件里,不能分开放在头文件和源文件中,这个问题以前在大一时就遇到过,当时还有同学讨论了好长时间,时间久了,忘记了,没有及时吸取教训,导致这次在这个问题上有浪费了好长时间。。 重载operator[]时的时候,应该返回数组元素本身值的引用,这样才可以直接对元素本身的数据成员进行修改。 类设计完成后,修改CPlaneWarDoc类中的数据成员,采用自定义的类组织数据。 这样敌机,敌机子弹和我方子弹的数量就可以动态添加和删除了,当敌机和子弹移动出了窗口界面显示范围就将其删除,节约内存。 2. 还有个问题,就是图片的显示问题。 我们为每个实例都设置了一个数据成员,用来存储图片,这个成员是从基类CWarObject继承而来的,这样就导致一个问题,每个敌机都是一样的,敌机的每个子弹的显示图片也是一样的,我方子弹也是一样,这样为每个角色实例都设置一张图片,是不是太浪费内存了,可不可以用类的静态成员来保存图片数据成员,因为类的静态成员是属于类自身的,不属于某个具体实例,这样在内存该类的所有实例共享同一张图片,节约了系统资源。因为静态成员是属于类自身的,所以必须要重新设计基类和继承的子类了,因此基类不能再有m_Image成员,必须将m_Image设置为子类的数据成员。可是每个角色的图片又不一样,敌机和我方战机显示图片并不一样,之前CPlane类的设计是为了更好的体现复用性,所以敌机和我当战机都是CPlane的实例。所以必须重新设计飞机和子弹类,从基类派生出各自自己的专属类。 敌机子弹类: 我方战机子弹类: 敌机类: 我方战机类: 3. 重点说说屏幕界面绘制的问题。 这是V1.0版本中使用的界面屏幕绘制代码部分。 程序中多次使用InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE )来通知屏幕更新视图,MSDN对这个函数的解释: 参数lpRect指定了屏幕更新区域,下一次发送WM_PAINT消息时,这个CRect矩形区域将会增加到屏幕的更新区域中,显然使用这个函数比使用I

文档评论(0)

wu12youli + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档