点击start按钮,进入下层界面,选择关卡。
1.创建项目以及添加资源
添加资源
2.设置游戏主场景
设置背景图片
重写paintevent事件画背景。
画背景上的图标
直接画太大了,我们需要先缩放图片再画。
开始按钮的创建
提供MyPushButton的构造的重载版本,可以让MyPushButton提供正常显示的图片以及按下后显示的图片。
首先创建一个自定义按钮类。
修改继承关系,继承QPushButton。
创建构造函数,第二个参数初始化为空。
创建开始按钮。
开始按钮跳跃特效实现。
头文件#include<QPropertyAnimation>
选择关卡场景配置
我们需要在mainscene.h中维护一个选择场景的对象。
但是我们发现,点击start按钮会瞬间进入下一个场景,无法看见动画特效,因此需要延时。
头文件#include<QTimer>
配置选择关卡场景内容
设置背景
结果如下:
返回按钮的图片切换
思路:按下的时候切换图片,释放的时候还原图片。
重写按钮的按下和释放事件。
让父类执行其他内容,防止鼠标按下失效。
开始场景与选关场景的切换
思路:当点击返回按钮时候,发送一个信号,选关场景接收到信号后会切换到主场景。
加入延时操作。
选择关卡按钮创建 ???
显示按钮图片
监听每个按钮点击事件。
给按钮图片添加文字(关卡号),注意要设置水平居中。
但是,我们发现现在点击关卡按钮,不会有输出了,这是因为标签把按钮控件挡住了。
设置让鼠标进行穿透。
翻金币游戏场景的基本配置
我们想要点击选关按钮进入对应场景,因此不需要监听选关信号了。
我们想要创建与关卡号对应的场景,因此PlayScene构造中需要传入int类型变量表明是第几关,因此需要重写构造函数。
在这里创建一个成员变量记录所选的关卡号。
加一个打印输出来验证是否正确。
没有问题,能跳转到对应的场景中。
初始化游戏场景
重写画家事件
返回按钮
点击返回按钮,回到选关场景。
思路如下:
首先,创建一个返回按钮。
接着就是信号的连接。我们需要点击返回按钮时触发一个返回的信号,告诉选关场景我们需要返回到该场景了。因为之前是从选关场景进入到游戏场景的,所以选关场景随后需要监听游戏场景的返回信号。
最后就是销毁游戏场景,回到选关场景。
显示选择的关卡号
金币类的封装
显示金币背景图案
金币类实现
金币类本质还是一个按钮,但是我们不能用之前自定义的按钮MyPushButton,因为金币按钮不需要弹跳功能,还有点击切换图片这种功能,所以和MyPushButton关系不大,因此重新构建一个类实现它。
创建金币
我们只需要能够传入一个构造金币的图片就行,之后变成银币修改传入的值即可。
与MyPushButton的构造类似,只不过传入的是一个图片路径。
每个关卡的默认显示
首先,添加了金币关卡的游戏数据。
第一个int是关卡号,后面的二维数组是关卡的数据。以第一个关卡为例。
这就是数据和关卡实际设计的对应关系。
在PlayScene中维护一个二维数组成员变量,记录每一关自己的数据
加入头文件#include "dataconfig.h"
金币翻转特效
金币的属性
为了能够翻转金币,我们需要知道每个金币的位置坐标以及当前的状态(金币还是银币)。
改变标志的方法
翻转后应该更新一下当前数组中该点的值。
最后,我们发现快速点击金币进行翻转,翻转动画没有结束就会开始翻转,因此我们需要设置一个记录翻转是否结束的变量来阻止翻转过程中进行新的翻转。
最后在监听事件中,只有可以翻转为true时,才执行翻转。
实现周围金币的翻转
我们需要一个记录所有mycoin的信息的变量,否则无法翻转除了当前mycoin外的其他金币。
判断游戏是否胜利并且禁用按钮
当金币发生反转时候,我们进行是否胜利检测。
游戏胜利后,禁止按钮点击操作。
重写点击事件。
胜利图片实现
首先我们创建一个在X轴中间,但是不在窗口内的胜利标签。
如果胜利了,move的y值为相反值,该图片就显示在窗口中了。
动画头文件#include<QPropertyAnimation>
设置音效
准备开始按钮的音效。
返回按钮音效。
翻金币和胜利音效。
项目优化,将场景切换的位置保持一致
主场景中
选关场景中
游戏场景中
项目打包
生成后有release文件夹。
找到qt源文件中的windeployqt,用来生成打包文件。
生成的这些文件就是运行该游戏的所有dll。即使没有配置qt环境也能运行了。