用Qt制作一个魔改版植物大战僵尸(基于飞机大战)

目录

  • 说在前面
  • 项目设计
    • 目的
    • 总体设计
      • 功能特点
      • 开发环境
      • 模块说明
    • 详细设计
      • 界面设计
      • 声音设计
      • 玩法设计
  • 部分较难功能的实现
    • 子弹产生、运动与内存管理
    • 碰撞检测
  • 结语
  • 源代码

说在前面

这不是作业,是作品

游戏成品体验可以在这里下载:
https://pan.baidu.com/s/1UKuK9dSbHsdhsc9SedR6AA
提取码:1606
直接找到exe文件运行就可以啦,另外有一个文本文档为游戏说明,由于我用户体验方面做得不好,所以大家可以先看看这个文档熟悉游戏操作。如果下载太慢但话可以私信我直接qq发源文件。(源代码在最后面)

另外实训的时候有一篇记录日志、笔记、心得的博客,链接在这里:
QT学习日志(附:简易计算器,qq登录界面,简易绘图板,植物大战僵尸魔改版项目实践)
里面有与本博客相关的内容,大家可以看一看

项目设计

目的

本项目为笔者大一暑假实训的结业项目,是对这段时间的学习与c++基础、开发软件的能力的综合考验。本项目名字为植物大战僵尸魔改版,以飞机大战的游戏模式为载体,采用植物大战僵尸、我的世界等游戏的一些元素设计而成,项目运用了信号与槽、多线程与事件监听,除此之外还涉及到内存管理,碰撞检测等系列难题,是这段时间c++实训成果的展示。

总体设计

功能特点

游戏借鉴了植物大战僵尸beta版的游戏风格。游戏共有9种模式加上无尽模式,五张背景,6种形态的植物以及24种子弹,并附带有植物大战僵尸的原生音效,鼠标可以控制植物,击杀僵尸后获得分数,分数达到一定的值植物会升级:

植物的属性:
1阶.(0分): 无效果
2阶.(2100分):双发
3阶.(4200分): 寒冰 被击中后僵尸射速减半(不是减移速) 有声效
4阶.(7200分) 闪光豌豆 必杀(且有寒冰效果)
5阶.(12000分) 谱尼 穿透 (有之前的效果)
6阶.(21000分) 闪光谱尼(分数21000) 什么类型的子弹都可以发射 (肥料 玉米卷 留声机 钱袋 浇水壶 巧克力……)

死亡条件是被僵尸的子弹击中15次。约半分钟更新一次游戏模式
分别为:
Crazy bullet/Drown/大睡天/Crazy bullet 2/僵尸舞会/僵尸狂暴
僵尸狂潮/Crazy bullet 3/僵尸隐形/无尽模式

开发环境

本项目开发环境为Qt开发,语言为c++

模块说明

用Qt制作一个魔改版植物大战僵尸(基于飞机大战)_第1张图片
分为四个部分:
第一部分为必要部分,为main函数,主窗口类与ui头文件
第二部分为植物子弹类和其产生、运动的线程类
第三部分为僵尸类和其产生、运动线程类
第四部分为僵尸子弹类和其产生、运动的线程类

详细设计

界面设计

游戏背景:(节选一张,共五张)
用Qt制作一个魔改版植物大战僵尸(基于飞机大战)_第2张图片
植物、僵尸与子弹
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
用Qt制作一个魔改版植物大战僵尸(基于飞机大战)_第3张图片
失败界面:
用Qt制作一个魔改版植物大战僵尸(基于飞机大战)_第4张图片

声音设计

用Qt制作一个魔改版植物大战僵尸(基于飞机大战)_第5张图片
这里无法预览声音,简单来说就是bgm为两首歌经过点点处理,音效来自pvz和mc。

玩法设计

  • 鼠标控制植物移动,可以瞬移
  • 被击中15次将会导致游戏失败
  • 约半分钟更新一次游戏模式
  • Crazy Bullet 3预览

    模式详细内容如下:
    Crazy bullet 1:子弹开始对植物方向发射
    Drown:所有子弹速度减半
    大睡天:植物不发射子弹
    Crazy bullet 2:子弹移速随机
    僵尸舞会:僵尸上下移动
    僵尸狂暴:僵尸射速✖️5
    僵尸狂潮:僵尸产速✖️4
    Crazy bullet 3:子弹跟踪
    僵尸隐形:关卡比较水,顾名思义
    无尽模式:僵尸产出会越来越快,每隔一定僵尸就会切换模式

部分较难功能的实现

子弹产生、运动与内存管理

用Qt制作一个魔改版植物大战僵尸(基于飞机大战)_第6张图片
由上图我们可以知道,写完子弹的产生与运动类,僵尸与僵尸的子弹相关类就可以依葫芦画瓢。但写子弹相关类的时候我确实遇到了一些问题,例如子弹储存在哪个类中,产生的子弹如何储存,消失的子弹如何处理,内存成了这次实训最大的问题,到实训结束都没有解决,只能等到以后系统学习相关知识的时候才能再优化一下。关于内存的心得依然在这篇博客里有谈到:QT学习日志
笔者通过多次调试,最终决定将子弹数组以QList的形式储存在子弹运动线程类的头文件中,每隔一段时间QList里的所有子弹都要运动,如果子弹符合消失的条件就清除子弹并释放其内存空间。子弹产生的线程负责每隔一段时间就产生子弹,并将子弹(通过主窗口类)传给子弹运动的线程类中,信号参数里为一个子弹对象.

碰撞检测

在CSDN上找了一些关于碰撞检测的方法,最后放弃了,自己想了一种最原始的方法
鼠标每移动一次,要向主窗口发射植物的位置信号,同时接收每个僵尸子弹的位置信号,做碰撞检测
每个子弹每移动一次,要向主窗口类发射子弹的位置信号,同时接收每个僵尸的位置信号,做碰撞检测
每个僵尸每移动一次,要向主窗口类发射僵尸的位置信号,同时接收每个子弹的位置信号,做碰撞检测
每个僵尸子弹每移动一次,要向主窗口类发射僵尸子弹的位置信号,同时接收植物的位置,做碰撞检测
碰撞检测即是判定子弹是否在僵尸的判断区内,这样就可以判断僵尸是否减少血量或者是子弹是否要消失等,由于要发射等信号实在太多,故可以将每移动一次发射一次信号改为移动一定次数发射一次信号,但是会造成一定程度上但碰撞检测不灵敏,表现在项目上就是子弹经过了僵尸却不消失,或者对僵尸造成几次伤害等。

结语

这个程序是我的程序开发入门作吧,虽然还有很多不够完善的地方,不过我还是挺满意了。项目做完那天发布给了几个朋友,看到朋友们在竞争分数时我也挺开心的,想不到自己也可以做出个有点意思的游戏了。这个游戏运用了很多的元素,我的世界的钻石镐,赛尔号的谱尼,还有植物大战僵尸的各种物体当子弹使,beta版的游戏模式,也算是对我喜欢的游戏的一个致敬吧。整体来说这个游戏难度比较大,游戏性很强,游戏元素丰富,值得一玩。以后如果有修改会继续发布。

源代码

植物大战僵尸魔改版源代码
为期20天的Qt实训,完成结业项目的时间大概为10天,10天前对C++都还掌握不牢,最终的成品竟然还令自己满意。
由于笔者为大一,项目难免有许多问题,欢迎大家指正。受到所学知识的约束,内存管理、碰撞检测等方面做得不是很好,游戏玩到僵尸狂暴出来等时候就会比较卡顿了,到无尽模式拼的甚至是电脑了,由于时间只有10天,而且大部分时间都在解决技术问题上,所以游戏的用户体验等方面也存在问题,但是在游戏性上还是下了功夫,游戏元素也比较丰富,大家能过目就很好啦。
下载源代码需要积分,如果你只是想体验下游戏就直接跳到页面顶端,那里有游戏成品的百度网盘链接,如果你愿意就游戏的某些方面交流或者谈一谈优化游戏的方法,可以私信我。

你可能感兴趣的:(Qt,游戏,c++,qt)