飞机空战修改优化.docVIP

  • 4
  • 0
  • 约2.86千字
  • 约 12页
  • 2017-06-15 发布于北京
  • 举报
飞机空战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矩形区域将会增加到屏幕的更新区域中,显然使用这个函数比使用Invalidate( BOOL bErase = TRUE )这个函数效率高。 但是这样导致了一个问题,多次使用Inval

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档