飞行射击游戏 ——结题报告 By 罗一轲、陈夏琨
一、程序目标 编写一个飞行射击游戏,飞行射击游戏结合了“射击”和“闪避”两大射击游戏的要素,玩家要“在敌人放出的大量子弹(弹幕)的细小空隙间闪避”,能给玩家闪避弹幕的时候的快感。
二 实现方案 编译条件:VS2013建立的WIN32应用窗体 1.可视化界面 运用MFC,调用Windows API来实现系统的可视化,编写帧函数并设定具体的一帧时间,所有的变化均以帧为单位进行。
2.对飞机的操作响应 运用keydown keypress keyup来对键盘上输入的按键信息进行对应的响应,以操控己方飞机达到对应的状态。 3.敌机设定 对于小型敌机,运用rand 以及switch函数规定的时间间隔下过一段时间随机创建一种敌机队列,敌机队列存在着与队列形式的运动轨迹以及攻击方式 对于大型敌机,隔一段时间创建一个敌机单体,只要该单体存在,每隔一段时间就会随机发动一次该单体专属的攻击模式,比如散弹型弹幕,圆圈状弹幕等。
三 具体实现 1.编写精灵类,作为敌我方飞机和敌我方子弹共同的基类,具有判定是否出界的IsVisible()、 渲染函数FrameRender()(用于时时更新图像)、 帧刷新函数FrameUpdate()(用于时时更新物体位置)这些实现动态运行的最基础的函数,超出游戏边界则删除精灵。 精灵类对象创建时组建成列表,并且精灵类具有纯虚的更新函数,使得精灵类的更新函数调用可以顺着链表依次传递
2.编写用于绘图及渲染的PICTURE类。LoadBitmap()、FreeBitmap()用于加载图像和释放内存,DrawBitmap()用于图像的实时更新,TransparentBitmap()用于使本来带有背景的图像以透明的背景显示在游戏的场景中。 3.编写bullet类,其中render()和update()是最重要的函数。二者都继承自Sprite(精灵)类,前者实现了图像的实时更新,后者实现了子弹的移动以及子弹与我方飞机的碰撞判定。
4.编写GAME CONTROL类,用于对按键进行响应的核心类,起到了main函数的功能,内涵SetWndDC ()、 StartGame() 、 UpdateScence() ,并且通过KeyDowm()、KeyUp()实现了两种不同的对键盘输入的响应。
5.编写自机的具现Principalplane类。 其中火力与生命均以数组方式加载显示, 设置了攻击频率m_fBulletFrequency、 无敌时间m_fInvincibletime参数;无敌状m_bUnDead、 开火m_bFire等状态。 其中的upDate()函数实现了与敌机、敌方子弹、资源碰撞的判定。
6、设计了EnemyPlane类,CreateEnemy()和AttackMode()中分别实现了多种子弹和攻击模式,upDate()中对各种敌机进行了个性化的设置。 7.编写 EXPLOSION类定义了爆炸,包括子弹爆炸和敌机爆炸2种爆炸模式。
8、编写子弹类,派生出敌方子弹和我方子弹类,其中重点实现了一定的追踪功能。 9、参考windows编程教材的实例学习了windows程序的必要格式,并改写出AircraftGame类
四、实现的功能 1、实现了五种不同类型的敌机,五种不同类型,不同发射及飞行方式的敌机子弹,以及三种不同飞行方式的我方子弹; 2、在操作模式上除上下左右外还增加了左上、左下、右上、右下四种飞行方式;
3、实现了以导弹形式射出的大招,对全屏敌机进行攻击; 4、添加了资源类,敌方飞机爆炸后会掉落资源,捡取红色资源可艺体生己方火力,捡取蓝色资源满一百可增加一次生命; 5、实现了敌方和我方两种不同类型的具有一定追踪能力的子弹;
运行截图
六、一些体会 经过两个月的时间、通过对这样一个游戏的研究和实践,我们对面向对象的开发有了一个完整的概念。课本上的C++范例实现的只是简单的Console程序,图形界面是怎么实现的?游戏中玩家与电脑实时的信息交互又是怎样实现的?两个月前的我们对此几乎一无所知。这两个月对游戏编写以及软件开发方面的入门式的研究让我们接触到了现代软件的开发环境、思路以及方法。
越是深入的学习编程,越是感叹C++强大的功能和无处不在的应用。C++是最值得学好学透的语言!Qt的信号与槽机制和元对象机制进一步发展了C++。Qt是当下应用最广泛的开发平台之一,而Qt对C++的发展已成为公认的经典不断被继承和发展。无论Qt或是基于图形界面的软件开发在将来是还是不是主流,C++都将一直发展下去,成为所有语言和开发思路共同的参考。因此C++是初学者通向程序编写这一世界最好的钥匙!
现在想来真是庆幸四个月前的选择。我们在上这门课以前都没有任何编程的基础,在选这门课之前也是犹豫再三的。但现在呢,我们感觉到自己已经窥探到了宏伟冰山的一角。我们现在以一种期盼而不是敬仰的目光来看待编程这个领域,因为我们已经对他有所了解,因为我们已经拥有了进入这个世界的资格——C++,以及一次实践的经验——我们期待着即将展开的对他的进一步的探索。
再来谈点对当代编程的感受。计算机的功能是如此的强大而我们的语言是如此的贫乏以至于如果仅仅用现有的语言从逻辑上去描述功能会大大限制计算机能力的施展。也因此,现在的开发语言很多都是定义出来而不是写出来的,也就是说,要实现某一个功能就新增几句语言(函数)而不是靠现有的语言去表述。在这个过程中,编程专家起到了至关重要的作用。他们编写底层代码,然后底层代码经过漂亮的封装,被提供给应用程序的编写人员。
现代的程序员把更多的精力投入到对定义函数的巧妙运用上。但早在MFC称霸之前,就有专家指出封装对程序开发者的创新能力有极大的限制作用。这个道理不言自明,但是现代的软件越来越复杂以至于就算是一个从硬件一直精通到图形界面的全能专家也不能(也不应)凭一己之力开发出来。利用其它专家的劳动成果是不可或缺的。在追求分工协作和保留研究和创新能力之间产生了矛盾。不过这种矛盾是必然的,这在工业的许多其它领域已经被无数次的验证过了。
不过应该还是有方法协调这二者的关系的。不必要事事躬亲,但一定要纵观全局,把握思想、理解本质。编程一路发展过来,是有规律可循的。现在的MFC虽然已淡出编程界,但其中的许多思想仍然在被继承和发展。这说明,有一些智慧是永恒的,这些智慧或许是拥有创造力的前提。那从这个角度看问题,对学习编程本身有什么启发呢?当下的必不可少,但对编程界这一路走来许许多多曾经统治一时的方法的研究也是有意义的。于是虽然大家普遍在用Qt,我们还是决定用MFC编写这一个游戏,也算是借此机会一窥十几年前的思想的精髓,这或许会对学习当下的语言有不小的启发。