首先是设计的 ER 图(我有去画 uml 图,但是 uml 需要体现各种函数,当我把大把的函数摆上去时,整个图显得十分的杂乱与不清晰,所以我决定采用 ER 图这种较为清晰明了的图形)
首先是对整体的介绍:
防御塔父类 defetowerparent
Tower1,tower2,tower3,tower4 四个子防御塔类公共继承了防御塔父类
Mainwindow 类 继承了 QWidget 主要负责窗口显示
Monster 类 内含了怪物的各种属性和对应函数 使用了 globalstruct 内的坐标结构体
Selectionbox 类 选择框类 内含对选择框的数据和对应函数
Startfrom 类 继承了 QWidfet 类开始界面类 主要用于体现对关卡按钮的设计 ui
Towerposition 类 防御塔坑类 内含对防御塔可以建造位置的标注接下来,将对个各类实现进行讲述。
对于背景的实现:
为了便于对地图的构建和素材的使用,直接采用了宏定义格子的方式,一块一块地画出方格以拼出整体的背景图片。
宏定义“格子”
先行用一个地图数组内置好不同位置产生什么方块
最后对这个数组的不同位置的值进行判断,按照值一一对应产生出 beach 图片方块,towerposition 方块,home 方块,obstacles 方块的图片
对多种防御塔的实现:
创建了防御塔的父类,将子弹类可以归并到这里一起实现,因为不同防御塔射出子弹的种类本身也可以算成防御塔的某种属性。将子弹有关的函数全部归并到 Bullet.cpp 内实现,其余四个防御塔统一直接继承父类关于防御塔的诸多属性,只需添加新的坐标以及防御塔大小的函数即可,如图
而在 tower1.cpp 的具体实现中,我们再对继承而来的函数和数据进行规定,因为防御塔种类和怪物种类颇多,我之前是用的文本读取的方式,这时候就会显得十分复杂,所以舍弃了之前的文本读取的方式,取消了之前的一个文本读取的类,直接在程序内进行数据的赋值和图片路径的规定。
对于多种防御塔的选择问题,是增加了一个选择框类(selectionbox)来实现,在鼠标点击事件中增加一个点击空的防御塔基点(towerposition)的事件,点击之后进行金钱值的判断,再来创建防御塔。
防御塔的升级功能
升级变化是新增的功能,具体的表现方式是把防御塔的数据增大,防御塔攻击范围放大、防御塔的图片放大,以及子弹爆炸效果的提升。
具体的实现是在防御塔父类中写下重新设置防御塔各项数据的函数,在 cpp 文件中实现相应的值的返回,然后在后续的鼠标点击事件中增加一种点击区域为已有防御塔的事件,如果判断金钱值够用,则会升级防御塔,也就是直接增加防御塔的相应数据(防御塔的宽高大小,射击的范围,攻击力,炮弹爆炸时产生的效果图片大小)
关卡选择
创建了主场景类(startfrom),开始界面用 ui 设计了一个比较简陋的进入界面,设置了 3 个按钮,分别进入不同的关卡,用信号槽监听三个按钮的反应,向 MainWindow 传输对应的关卡信号并在新的显示窗口显示。
在 MainWindow 里接受这个信号,并依据信号的种类产生对应的关卡场景和怪物。
产生不同的关卡的方式就是上述的背景产生的方式,用赋值的方式给地图数组附上对应信号的内置地图数组的值,然后再打印拼成不同关卡的背景,以实现关卡的切换。
怪物的产生
原本怪物的产生是比较单一的,是在固定的一个位置产生同样种类的怪物,这次更新主要是丰富了怪物的种类和产生的地方,在不同的路径产生不同的怪物。
另外的,因为游戏后期怪物数目过多,原先版本中增添的血条功能使得界面极为繁琐,影响了正常的观感,所以把关于血条显示的功能去除了,以免影响游戏的观感。
怪物具体的函数和数据的实现和防御塔的实现方式基本一致,区别是没有写一个父类进行继承,怪物的产生特别之处在于怪物在哪个路径,第几个起始点,产生什么编号的怪物,解决的方式是用 InsterMonster 的函数来进行控制,用一个 counter 的数据来统计被击倒的怪物数,根据 counter 值的变化来“插入“符合游戏进度的怪物种类和数目,并实时更新。
关于怪物移动路径的实现是,比较已经在私有数据里存储好的位置数组和自己已处在的位置,如果满足条件,则发生移动操作,并更新一次自己的位置。
背景音乐的添加
通过学习使用了 QMediaPlayer 类 这样一个 QT 自带的多媒体类简单地实现了对音乐文件的播放。
特别设计或实现说明由老师给的大作业要求中,基本功能如下:
多种类型的敌人 2.不同类型的防御塔与不同属性 3.游戏难度随游戏进度不断增加。以上均全部实现OO 特性的体现:封装、继承、多态、常类型,上述的截图代码中均有体现,也全部实现。接下来就是关于升级功能,也就是特别设计。bgm 的播放,bgm 也是为了还原保卫萝卜,采用了原曲,让人更有代入感。防御塔的升级功能,上面已详细讲述防御塔的升级功能与其效果。防御塔资源的积累,利用得到的资源(即游戏中的金币),来进行对防御塔的升级。关卡的切换,一共设计了三道关卡,玩家可进行选择。不同的关卡具有不同的地图,同时关卡难度逐级递增,第三关是最难的。游戏使用说明:
大作业主要是以保卫萝卜的图形作为模板进行还原的,即以自己的代码语言去尽可能的还原保卫萝卜这款游戏。整体的玩法,与保卫萝卜很相像。
进入开始页面,会有保卫萝卜的 bgm,与三个关卡,玩家可以自行选择不同怪兽会从出生点出来,不同的关卡怪兽会从不同的位置出来。在怪兽的行经路线上,玩家可以在特定的位置(Towerposition)放置防御塔,防御塔分为四种,不同的防御塔价格不一样,对应的价钱也不一样,威力与价钱成正比。怪兽一共有五种,波束越到后面,出来的怪物越多,难度大的怪物出来的也越多,玩家初始有 1000 金币,打死怪物也会得到金币,金币用来构建与升级防御塔。玩家一共有 6 条命,6 条命用完了游戏就将结束。将怪物全部消灭即可成功通关。