【QT】火柴人跑酷实现过程

原文:https://nuyoah-xlh.github.io/2020/10/06/%E7%81%AB%E6%9F%B4%E4%BA%BA%E8%B7%91%E9%85%B7/

课题来源

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

项目地址

项目仓库: 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
总体方案
总体流程图
程序总体思路,总的流程图或框图
20201028131432875.png

相关数据结构

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文件,放入后,程序正常运行,问题得以解决。

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值