火柴人跑酷
课题来源
课题自拟,灵感来源于火柴人跑酷游戏,通过互联网寻找图片、声音资源,团队合作开发出此项目。
项目地址
项目仓库: https://github.com/Nuyoah-xlh/RunGame
课题功能
1.实现火柴人、障碍物、游戏道具的生成和移动绘图,主页面和游戏界面的绘制;
2.按下W键控制火柴人向上跳跃,在空中可进行二次跳跃;
3.按下S键控制火柴人加速下落;
4.按下A键控制火柴人向左加速移动;
5.按下D键控制火柴人向右加速;
6.游戏中按下esc键暂停游戏,再次按下esc键继续游戏;
7 .游戏结束后按下R键重新开始游戏,按下B键返回游戏主菜单;
8.控制火柴人跑得越远得分越高,吃到金币会有加分并增加金币数,碰到障碍物会有扣分;吃到红心会加速回血,吃到法杖会暂时消除所有障碍物;
9.不碰到障碍物人物会自动缓慢回血,血条为空时死亡,游戏结束;
10.实现存档功能,存储最高纪录,打破纪录后会自动更新;
11.加入游戏背景音乐、跳跃音效、碰撞音效等。
开发平台
所使用的开发环境:windows、C++环境、qt5
总体方案
总体流程图
程序总体思路,总的流程图或框图
相关数据结构
MainWindow类 主窗口类,实现按钮具体功能并使用其他类
Barriers类 创建障碍物(墙体、箭、圆刺)和道具(法杖、血瓶)
gamewidget类 游戏类,接收按键操作控制人物运动和其他效果
Wall类 实现墙体的产生、运动,判断碰撞等
Coin类 实现金币的产生、旋转、运动,判断碰撞
Arrow类 实现箭的产生、运动,判断碰撞等
GameButton类 实现不规则按钮的产生及动态效果
role类 实现火柴人的产生、奔跑、跳跃姿态等
Vector容器 存放产生的各类障碍物和道具
函数功能
void enterEvent(QEvent *event); 鼠标移入,按钮变大
void leaveEvent(QEvent *event); 鼠标移出,按钮恢复
Void mouseReleaseEvent(QMouseEvent *Event) 鼠标点击按函数
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(); 返回游戏主菜单
调试记录
问题1
问题:在程序运行中,火柴人和墙体离得较远却仍被判为发生碰撞。
解决方案:经分析,发现墙体的图片有较大的边缘空隙,通过变换墙体图片的尺寸,问题得以解决。
问题2
问题:程序运行中,按下暂停后,火柴人依然在跑动,不能停止。
解决方案:测试发现暂停后,显示火柴人跑步的定时器remove未关闭;暂停后关闭定时器,返回游戏时再打开定时器,问题得以解决。
问题3
问题:火柴人奔跑过程中,可能会出现因未知原因扣血。
解决方案:经过排查发现,有部分障碍物的产生地点在地面以下,与火柴人脚部碰撞;在随机产生障碍物的坐标时,加入限制条件,使其均在地面以上,天花板以下,问题得以解决。
问题4
问题:血量扣完游戏结束时,重新开始游戏,游戏没有从头开始,而是在上次结束的位置继续游戏。
解决方案:发现相关定时器未关闭,障碍物仍存留在容器中;游戏结束后,停止一切定时器,清空障碍物容器,分数、金币清零,问题得以解决。
问题5
问题:加入背景声音时,提示文件太大无法载入。
解决方案:查询资料后,发现在pro文件中加入CONFIG+=resources_big代码后,即可载入较大资源。
问题6
问题:程序正在运行时,突然异常结束。
解决方案:将程序中的指针排查后,将指向未知区域的指针赋值NULL,问题解决。
问题7
问题:将文件打包成exe可执行文件时,程序打包后无法运行。
解决方案:exe所在目录下,除了必要的源文件和dll文件外,本项目还需要放入用于存档的save.txt文件,放入后,程序正常运行,问题得以解决。
分工情况
成员1
姓名:肖林航
主要工作:
编写gamewidget游戏类、人物类role、障碍物基类Barriers、Barriers派生类(墙体类Wall、血瓶类Bottle、法杖类Magic)。
实现了主界面、暂停界面、游戏结束界面的绘制;实现墙体、法杖、血瓶的随机生成;完成游戏中火柴人、墙体、法杖、血瓶、背景图和地面的绘制并使地图运动起来;实现了用户通过操作键盘控制人物上下左右移动,实现了游戏结束后可选择返回主界面或重新开始游戏。
撰写了报告的总体方案(总体流程图、相关数据结构)、课题功能、调试记录、分工情况的部分内容;负责了游戏的调试、Github项目更新、exe可执行文件的打包;并进行报告的排版和整理。
通过github搭建博客,并上传团队博客,撰写博客的部分内容。
成员2
姓名:夏天
主要工作:
箭障碍物的产生,运动,判断碰撞,圆形障碍物的产生,运动,判断碰撞,动态效果
暂停按键
q按键按下后向前闪现400距离
血量的设置,血条的显示
分数的计数增加和显示,金币数量的计数
存档记录最高分数记录
写实验报告
做演示ppt
写CSDN博客,记录结果
录制说明视频
录制测试视频
成员3
姓名:王国伟
主要工作:
主窗口按钮图片的设计
三个弹出窗口的建立
游戏玩法,操作等的说明编写
主窗口页面按钮的排列
心得体会
课程设计过程中的心得和体会。
肖林航:在此次的团队项目中,我可以更加熟练的使用Github、Git,对QT开发也有了更加深入的理解,也体验到了如何进行团队合作项目,同时也对C++的类和对象有了实际的了解和使用,可以说是受益良多。
夏天:在此次团队项目中,我对QT开发有了全面且深入的了解,体验到了如何更有效的进行团队项目的合作,制作视频,写报告方面也有了一定的经验。在实现这个程序当中遇到了很多困难,但是我们不依不饶,努力寻找解决问题的方法,最终完成了这个程序的设计。
王国伟:在此次的团队项目中,我体验到了如何在团队里通过合作来设计一个项目,从而认识到了自己的不足。通过这次项目的参与,更加深刻的理解了Qt的功能不止可以用来进行ui设计,还可以通过纯代码来编写页面。受益匪浅。




.jpg)

.jpg)


