2020-10-28

2 课题二:RunGame
2.1课题功能及来源
课题来源
课题自拟,灵感来源于火柴人跑酷游戏,通过互联网寻找图片、声音资源,团队合作开发出此项目。

课题功能
1.实现火柴人、障碍物、游戏道具的生成和移动绘图,主页面和游戏界面的绘制;
2. 按下W键控制火柴人向上跳跃,在空中可进行二次跳跃;
3. 按下S键控制火柴人加速下落;
4.按下A键控制火柴人向左加速移动;
5.按下D键控制火柴人向右加速;
6.游戏中按下esc键暂停游戏,再次按下esc键继续游戏;
7 .游戏结束后按下R键重新开始游戏,按下B键返回游戏主菜单;
8. 控制火柴人跑得越远得分越高,吃到金币会有加分并增加金币数,碰到障碍物会有扣分;吃到红心会加速回血,吃到法杖会暂时消除所有障碍物;
9. 不碰到障碍物人物会自动缓慢回血,血条为空时死亡,游戏结束;
10.实现存档功能,存储最高纪录,打破纪录后会自动更新;
11.加入游戏背景音乐、跳跃音效、碰撞音效等。
2.2 开发平台
所使用的开发环境:windows、C++环境、qt5
2.3 总体方案
2.3.1 总体流程图
程序总体思路,总的流程图或框图

在这里插入图片描述

2.3.2 相关数据结构
程序设计中所使用的数据结构:类、链表等
数据结构 功能
MainWindow类 主窗口类,实现按钮具体功能并使用其他类
Barriers类 创建障碍物(墙体、箭、圆刺)和道具(法杖、血瓶)
gamewidget类 游戏类,接收按键操作控制人物运动和其他效果
Wall类 实现墙体的产生、运动,判断碰撞等
Coin类 实现金币的产生、旋转、运动,判断碰撞
Arrow类 实现箭的产生、运动,判断碰撞等
GameButton类 实现不规则按钮的产生及动态效果
role类 实现火柴人的产生、奔跑、跳跃姿态等
Vector容器 存放产生的各类障碍物和道具

2.4 详细设计
2.4.1函数简介
列出程序中所有函数,及其作用

函数 功能
void enterEvent(QEvent *event); 鼠标移入,按钮变大
void leaveEvent(QEvent *event); 鼠标移出,按钮恢复
Void mouseReleaseEvent(QMouseEvent *e);
鼠标点击按函数
void paintEvent(QPaintEvent *event); 绘图函数,绘制人物、地图、障碍物、道具,主界面和游戏结束、暂停的绘制
void start_game(); 开始游戏
void keyPressEvent(QKeyEvent *event); 键盘按下事件
void keyReleaseEvent(QKeyEvent *event); 键盘释放事件
void addBarriers(); 随机产生障碍物、道具
void gamepause(); 游戏暂停
void gamecontinue(); 游戏继续
void dashmove(); 闪现操作
void gameIsOver(); 游戏结束,数据恢复
int getX(); 获取人物坐标
int getY(); 获取人物坐标
int getWid(); 获取人物宽度
int getHei(); 获取人物高度
void move(bool up,bool down,bool right,bool left,bool esc); 根据传入的参数进行人物移动
void pauserole(); 暂停人物计时器
void continuerole(); 开启人物计时器
void reduceHp(); 减少生命值
void increaseHp(int d); 增加生命值
int getCurHp(); // 返回当前生命值
int getCurHpPercent(); 获取当前生命值所占百分比
void dashmove_() ; 改变人物x位置
void addScore(int s); 加分
int getScore(); 返回当前分数
bool done(); 障碍是否已离开视野
bool isCollision(int lx,int ly,int wid,int hei); 判断是否发生碰撞
void move(); 障碍物、道具移动
void setScore(int n); 增加分数
void restart(); 重新开始
void init(); 移动位置
void back(); 返回游戏主菜单

2.4.2 main函数
主函数流程图
在这里插入图片描述

2.4.3 bool done()函数
各个函数流程图
在这里插入图片描述

done函数用于判断物体的x坐标,与界面的宽度进行比较,判断是否超过左边界。

2.4.4 bool isCollision(int lx,int ly,int wid,int hei)
在这里插入图片描述

用QRect获取物体的坐标,长和宽,将获取信息的两个物体用intersects函数进行判断是否发生碰撞

2.4.5 void enterEvent(Qevent *event)

在这里插入图片描述

判断鼠标是否进入按钮,如果进入,则放大图标,产生动态效果。

2.4.6 int getScore()
在这里插入图片描述

调用函数使分数变量Score返回

2.4.7 int getX()
在这里插入图片描述

调用函数来获取所需物体的x坐标并返回

2.4.8 void keyReleaseEvent(QKeyEvent *event)
在这里插入图片描述

松开相应键盘按钮,进行对应的操作

2.4.9 void leaveEvent(Qevent *event)

在这里插入图片描述

鼠标移开图标,图标缩小成原来大小

2.4.10 void paintEvent(QPaintEvent *event)

在这里插入图片描述

paintEvent函数用于绘图,首先创建QPainter的对象,根据当前状态进行相应的图形绘制,在运行时绘制背景,人物,金币,障碍物,道具分数,血量等,以及暂停、结束时的绘图。

2.4.11 void setScore(int n)

在这里插入图片描述

调用函数来对分数进行加减操作

2.4.12 void addBarriers()
在这里插入图片描述

首先定义障碍物计时的静态变量,再用随机数产生随机坐标,每隔一段时间时间增加障碍物和道具。

2.4.13 void back()
在这里插入图片描述

该函数使游戏恢复开始界面的按钮,使其显示出来,并清理相关数据。

2.4.14 恢复游戏函数
void continuerole();
在这里插入图片描述

继续游戏时,调用此函数,开启run的计时器,继续游戏

void gamecontinue();
在这里插入图片描述

按下esc继续游戏,暂停判断符变为true,开启run计时器

2.4.15 void gameIsOver()
在这里插入图片描述

血量为0时 进入函数,停止计时器,显示分数,清除所有障碍物,初始化游戏数据

2.4.16 void gamepause()
在这里插入图片描述

按下esc暂停,isPause判断符设定为true,停止run的计时器

2.4.17 void keyPressEvent(QKeyEvent *event)
在这里插入图片描述

按下键盘按钮,接受键盘按钮信息,做出对应键位的操作
2.4.18 void mouseReleaseEvent(QMouseEvent *e)

在这里插入图片描述

鼠标点击开始按钮,isRun设定为ture,移出开始界面的按钮
2.4.19 人物移动函数void move(bool up,bool down,bool right,bool left,bool esc)
在这里插入图片描述

根据传入的参数判断是否进行跳跃/二段跳、加速下落、向左加速、向右加速。
2.4.20 void pauserole()
在这里插入图片描述

暂停时,暂停run_Timer计时器,停下人物的所有动作。

2.4.21 void start_game()
在这里插入图片描述

开始游戏后,创建role的对象,开启run_Timer计时器,开启血量回复计时器,初始化有关的数据

2.5 测试与运行
视频里进行程序的测试吃金币,吃血包,撞击障碍物,清除障碍物,暂停,游戏结束的返回界面和最高记录的演示。
见 演示视频.mp4
2.6 调试记录

问题1
问题:在程序运行中,火柴人和墙体离得较远却仍被判为发生碰撞。
解决方案:经分析,发现墙体的图片有较大的边缘空隙,通过变换墙体图片的尺寸,问题得以解决。

问题2
问题:程序运行中,按下暂停后,火柴人依然在跑动,不能停止。
解决方案:测试发现暂停后,显示火柴人跑步的定时器remove未关闭;暂停后关闭定时器,返回游戏时再打开定时器,问题得以解决。

问题3
问题:火柴人奔跑过程中,可能会出现因未知原因扣血。
解决方案:经过排查发现,有部分障碍物的产生地点在地面以下,与火柴人脚部碰撞;在随机产生障碍物的坐标时,加入限制条件,使其均在地面以上,天花板以下,问题得以解决。
问题4
问题:血量扣完游戏结束时,重新开始游戏,游戏没有从头开始,而是在上次结束的位置继续游戏。
解决方案:发现相关定时器未关闭,障碍物仍存留在容器中;游戏结束后,停止一切定时器,清空障碍物容器,分数、金币清零,问题得以解决。
问题5
问题:加入背景声音时,提示文件太大无法载入。
解决方案:查询资料后,发现在pro文件中加入CONFIG+=resources_big代码后,即可载入较大资源。

问题6
问题:程序正在运行时,突然异常结束。
解决方案:将程序中的指针排查后,将指向未知区域的指针赋值NULL,问题解决。
问题7
问题:将文件打包成exe可执行文件时,程序打包后无法运行。
解决方案:exe所在目录下,除了必要的源文件和dll文件外,本项目还需要放入用于存档的save.txt文件,放入后,程序正常运行,问题得以解决。

2.8 分工情况

详细记录合作人的班级、学号、姓名;两人在设计、编码、调试、报告撰写、演示文档的制作、演示等所有步骤中的分工情况。
必须包含每个人的代码分工情况,具体代码量。

成员1
姓名:肖林航 班级:9191068406 学号:919106840638
主要工作:

  1. 编写gamewidget游戏类、人物类role、障碍物基类Barriers、Barriers派生类(墙体类Wall、血瓶类Bottle、法杖类Magic)。
  2. 实现了主界面、暂停界面、游戏结束界面的绘制;实现墙体、法杖、血瓶的随机生成;完成游戏中火柴人、墙体、法杖、血瓶、背景图和地面的绘制并使地图运动起来;实现了用户通过操作键盘控制人物上下左右移动,实现了游戏结束后可选择返回主界面或重新开始游戏。
  3. 撰写了报告的总体方案(总体流程图、相关数据结构)、课题功能、调试记录、分工情况的部分内容;负责了游戏的调试、Github项目更新、exe可执行文件的打包;并进行报告的排版和整理。
  4. 通过github搭建博客,并上传团队博客,撰写博客的部分内容。

成员2
姓名:夏天 班级:9191068406 学号:919106840636
主要工作:

  1. 箭障碍物的产生,运动,判断碰撞,圆形障碍物的产生,运动,判断碰撞,动态效果
  2. 暂停按键
  3. q按键按下后向前闪现400距离
  4. 血量的设置,血条的显示
  5. 分数的计数增加和显示,金币数量的计数
  6. 存档记录最高分数记录
  7. 写实验报告
  8. 做演示ppt
  9. 写CSDN博客,记录结果
  10. 录制说明视频
  11. 录制测试视频

成员3
姓名:王国伟 班级:9191068406 学号:919106840634
主要工作:

  1. 主窗口按钮图片的设计
  2. 三个弹出窗口的建立
  3. 游戏玩法,操作等的说明编写
  4. 主窗口页面按钮的排列

3 心得体会
课程设计过程中的心得和体会。
肖林航:在此次的团队项目中,我可以更加熟练的使用Github、Git,对QT开发也有了更加深入的理解,也体验到了如何进行团队合作项目,同时也对C++的类和对象有了实际的了解和使用,可以说是受益良多。

夏天:在此次团队项目中,我对QT开发有了全面且深入的了解,体验到了如何更有效的进行团队项目的合作,制作视频,写报告方面也有了一定的经验。在实现这个程序当中遇到了很多困难,但是我们不依不饶,努力寻找解决问题的方法,最终完成了这个程序的设计。

王国伟:在此次的团队项目中,我体验到了如何在团队里通过合作来设计一个项目,从而认识到了自己的不足。通过这次项目的参与,更加深刻的理解了Qt的功能不止可以用来进行ui设计,还可以通过纯代码来编写页面。受益匪浅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值