1.本游戏的目标人群
- 本游戏是单人游戏,主打的是密集子弹下玩家进行躲避,没有多人内容
2.游戏的基本规则
- 游戏全程共一关,分为boss战和道中,关卡的推进与时间相关。规则与基本打飞机规则一致,敌人有血量设定,玩家只要被子弹击中一次或是与小怪接触便减少一点生命值,初始生命值一共3点,全部失去后死亡。
- 玩家子弹威力不会升级,但是拥有bomb,每次使用bomb会消去全屏的子弹和小怪,并且使用bomb和死亡复活时会获得4s的无敌时间
- 小怪阶段可分为两个小阶段,第一阶段有在一定高度随机横着出现并沿直线飞过屏幕的发射三枚子弹的小怪,击杀此类小怪可以获得道具“点”,唯一的作用是增加游戏分数,第二阶段增加了竖着坠落的死尸小怪,死尸小怪只有一血,如果不攻击只有碰撞判定。若击杀则会发射5颗子弹,并且沿着y轴方向的子弹弹速较快,难以躲避。两个阶段分别持续一段固定的时间
- boss出现时将等待10s用于使得出界的子弹消失
- boss的第一阶段将会发射圆形的子弹,并且自身会进行倒三角形移动,避免玩家站着不动就可以躲开子弹情况
- boss的第二阶段仍然会发射圆形子弹,但是因为发射时自身的位置在一定区域内随机出现且发射频率较高,所以会比较难以躲避。且看起来比较杂乱
- boss的第三阶段是在比较低的位置发射大量的随机子弹(数目固定,且子弹下一过程中轨迹也是随机的,boss本身也会不停的从屏幕左边移动到屏幕的右边。
- 使用了sfml中的audio,graphics,system几个库
- 配置环境:按照SFML官方教程配置就可以,配置过程中遇到的问题是对于同一个类型的功能(如Audio),有一些库是用来debug模式的,有一些是用来其他模式下用的,如果混用就会发生类似“无法解释的外部名称”这种报错类型。在配置的过程中花了一番功夫。
- 关于帧数:我采用了setframe这个函数,并且设置为了100,在实现初期因为没有清理出界的sprite和enemy和bullet,导致了内存在持续上升(从任务管理器观测),玩一段时间以后便出现了效能问题。在后期清理出界元素以后情况好转了一些,在boss战的时候后子弹虽然增长了许多,但是由于碰撞判定的简化和不再需要判定吃道具,帧数依然可以得到保证
- 关于游戏界面和图形和音乐:由于我没有比较好的图像处理软件(抠图用的是美图秀秀...),而且改游戏的核心在于子弹的设计。所以界面非常简单。甚至取消了背景
- 运行界面截图
- 希望改进的部分:
- 更加美观的页面,由于期末和六级的原因我已经没有时间实现了
- 更多的关卡,由于对const的理解不够深刻,我们没有实现我想实现的最后一个关卡。而且我本来想实现更多的关卡
- 使用圆形碰撞判定,由于考虑到效率问题,我采用了sfml自带的方向判定(事实上本类游戏的特点便是判定点远远小于自身的贴图大小,否则在密集子弹下无法存活,由于时间问题我担心做好以后发现有效能问题,最后没有时间调试,所以我采用了sfml自带的碰撞判定
- 环境的搭配:我感觉环境的搭配实在是太麻烦了,出现了很多我没想到过的错误。。。而且难以解决,要说解决方法还是直接问别人吧,我在环境的搭配上花费了不少时间。
- 面向对象编程:在最初我做这个项目的时候用的还是c语言的思想,最初主要在main函数里写了大量内容,并且考虑使用结构体,但是看了example以后我感觉用c++写这种比较大的项目真是太好了...功能之间的关系都很明朗,不过类之间通信比较麻烦,因为我是在想不到什么方法可以把hero的position传到bullet那个类里面(如果可以这么做,可以实现指向自机的子弹)(虽然可以通过把自机的位置作为参数传递给bullet这个类,使得最初设置位置的时候可以设置成指向自机,但是这太麻烦了。我问了其他人好想是应当把这个自机的位置设置为静态变量,但是似乎在vs里面把sf类里的一些结构设置为全局变量和静态变量都会出很多问题。所以最后我放弃了
- vs的使用:在这个项目里边真的用到了很多的类,而且每个类的成员函数非常多,我感觉到后面我发现很多vs的功能还是很实用的,像是用F12找定义位置,创建成员函数以后直接用Ctrl+.来描述这个函数。
- 另外还积累了很多vs报错的原因,现在看到vs的有些报错大致能猜到是出了什么小问题(像少了个大括号或者是调用函数忘记加括号了
- 在实现圆形子弹我要写很多重复的内容,于是我用到了前半个学期学的文件输入输出的方法写了小程序帮助我写一些重复度很高的内容,我感觉以后可能也要用到这个技巧。