Qt 综合练习小项目--反金币(1/2)

news/2025/4/2 5:29:51/

目录

1 项目简介

2 项目基本配置

2.1 创建项目

2.2 添加资源

3 主场景

3.1 设置游戏主场景配置

3.2 设置背景图片

3.3 创建开始按钮

3.4 开始按钮跳跃特效实现

3.5 创建选择关卡场景

3.6 点击开始按钮进入选择关卡场景


1 项目简介

翻金币项目是一款经典的益智类游戏,我们需要将金币都翻成同色,才视为胜利。首先,开始界面如下:

点击start按钮,进入下层界面,选择关卡:

在这里我们设立了20个关卡供玩家选择,假设我们点击了第1关,界面如下:

如果想要赢取胜利,我们需要点击上图中红色方框选取的区域,翻动其上下左右的金币,然后当所有金币都变为金色,视为胜利,胜利界面如下:

2 项目基本配置

2.1 创建项目

打开Qt-Creator,创建项目:注意名称不要包含空格和回车,路径不要有中文。

类信息中,选择基类为QMainWindow,类名称为 MainScene,代表着主场景。

点击完成,创建出项目:

 创建的项目结构如下:

2.2 添加资源

将资源添加到当前项目下

然后创建.qrc文件 

进入编辑模式,添加前缀 “/” ,添加文件 

将所有资源文件进行添加

至此将所有需要的资源添加到了本项目中。

3 主场景

3.1 设置游戏主场景配置

点击mainscene.ui文件,设计其菜单栏如下:

设计“退出”菜单项,objectName为 actionQuit,  text 为 退出;

移除自带的工具栏与状态栏

回到MainScene.cpp文件,进入构造函数中,进行场景的基本配置,代码如下: 

//设置固定大小this->setFixedSize(320,588);//设置应用图片this->setWindowIcon(QPixmap(":/res/Coin0001.png"));//设置窗口标题this->setWindowTitle("老帮主带你翻金币");

运行效果如图:

实现点击开始,退出游戏功能,代码如下:

//点击退出,退出程序connect(ui->actionQuit,&QAction::triggered,[=](){this->close();});

3.2 设置背景图片

重写MainScene的PaintEvent事件,并添加一下代码,绘制背景图片。

void MainScene::paintEvent(QPaintEvent *)
{//创建画家,指定绘图设备QPainter painter(this);//创建QPixmap对象QPixmap pix;//加载图片pix.load(":/res/PlayLevelSceneBg.png");//绘制背景图painter.drawPixmap(0,0,this->width(),this->height(),pix);//加载标题pix.load(":/res/Title.png");//缩放图片pix = pix.scaled(pix.width()*0.5,pix.height()*0.5);//绘制标题painter.drawPixmap( 10,30,pix.width(),pix.height(),pix);
}

运行效果如图:

3.3 创建开始按钮

开始按钮点击后有弹跳效果,这个效果是我们利用自定义控件实现的(QPushButton不会自带这类特效),我们可以自己封装出一个按钮控件,来实现这些效果。创建MyPushButton,继承与QPushButton。

 

点击完成。

修改MyPushButton的父类

提供MyPushButton的构造的重载版本,可以让MyPushButton提供正常显示的图片以及按下后显示的图片。代碼如下:

//normalImg 代表正常显示的图片//pressImg  代表按下后显示的图片,默认为空MyPushButton(QString normalImg,QString pressImg = "");QString normalImgPath;  //默认显示图片路径QString pressedImgPath; //按下后显示图片路径实现的重载版本MyPushButton构造函数代码如下:MyPushButton::MyPushButton(QString normalImg,QString pressImg)
{//成员变量normalImgPath保存正常显示图片路径normalImgPath = normalImg;//成员变量pressedImgPath保存按下后显示的图片pressedImgPath = pressImg;//创建QPixmap对象QPixmap pixmap;//判断是否能够加载正常显示的图片,若不能提示加载失败bool ret = pixmap.load(normalImgPath);if(!ret){qDebug() << normalImg << "加载图片失败!";}//设置图片的固定尺寸this->setFixedSize( pixmap.width(), pixmap.height() );//设置不规则图片的样式表this->setStyleSheet("QPushButton{border:0px;}");//设置图标this->setIcon(pixmap);//设置图标大小this->setIconSize(QSize(pixmap.width(),pixmap.height()));
}

 回到MainScene的构造函数中,创建开始按钮:

 MyPushButton * startBtn = new MyPushButton(":/res/MenuSceneStartButton.png");startBtn->setParent(this);startBtn->move(this->width()*0.5-startBtn->width()*0.5,this->height()*0.7);

 运行效果如图:

不规则的开始按钮添加完成。

3.4 开始按钮跳跃特效实现

连接信号槽,监听开始按钮点击

//监听点击事件,执行特效connect(startBtn,&MyPushButton::clicked,[=](){startBtn->zoom1(); //向下跳跃startBtn->zoom2(); //向上跳跃});

zoom1与zoom2 为MyPushButton中扩展的特效代码,具体如下:

void MyPushButton::zoom1()
{//创建动画对象QPropertyAnimation * animation1 = new QPropertyAnimation(this,"geometry");//设置时间间隔,单位毫秒animation1->setDuration(200);//创建起始位置animation1->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));//创建结束位置animation1->setEndValue(QRect(this->x(),this->y()+10,this->width(),this->height()));//设置缓和曲线,QEasingCurve::OutBounce 为弹跳效果    animation1->setEasingCurve(QEasingCurve::OutBounce);//开始执行动画animation1->start();
}void MyPushButton::zoom2()
{QPropertyAnimation * animation1 =  new QPropertyAnimation(this,"geometry");animation1->setDuration(200);animation1->setStartValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
animation1->setEndValue(QRect(this->x(),this->y(),this->width(),this->height()));animation1->setEasingCurve(QEasingCurve::OutBounce);animation1->start();
}

运行代码,点击按钮,测试弹跳效果。

3.5 创建选择关卡场景

点击开始按钮后,进入选择关卡场景。

首先我们先创建选择关卡场景,添加新的C++文件。

 

类名为ChooseLevelScene 选择基类为QMainWindow,点击下一步,然后点击完成 。

3.6 点击开始按钮进入选择关卡场景

目前点击主场景的开始按钮,只有弹跳特效,但是我们还需要有功能上的实现,特效结束后,我们应该进入选择关卡场景

在MainScene.h中 保存ChooseScene选择关卡场景对象。

 //选择关卡场景ChooseLevelScene *chooseScene = new ChooseLevelScene;我们在zoom1和zoom2特效后,延时0.5秒,进入选择关卡场景,代码如下:
//延时0.5秒后 进入选择场景QTimer::singleShot(500, this,[=](){this->hide();chooseScene->show();});

测试点击开始,执行特效后延时0.5秒进入选择关卡场景 


http://www.ppmy.cn/news/1135150.html

相关文章

OpenCV 4.x 版本的新特性都有哪些?

文章大纲 V 4. 0DNNV 4.0 - 4. 8cheatsheetvideo analysis参考文献与学习路径2016年的时候我快研究生毕业了,那时候OpenCV 2.4.x 版本非常的流行,当时3.x 的版本刚发布,很多人都没有用习惯。 我写过一遍笔记: OpenCV 3.0 3.1版本的改进家里还有一本书:《OpenCV 3 计算机视…

遗留系统陷入困境

当我们谈论遗留系统时&#xff0c;我们经常会想到数据中心某处的过时服务器和交换机。我们带着一种病态的迷恋阅读了有关系统性技术问题的文章&#xff0c;这些问题在假期周末困扰着其他旅行者&#xff0c;并为他们缺乏远见而摇头。 然后&#xff0c;我们坐在屏幕前&#xff0…

ctfshow—1024系列练习

1024 柏拉图 有点像rce远程执行&#xff0c;有四个按钮&#xff0c;分别对应四份php文件&#xff0c;开始搞一下。一开始&#xff0c;先要试探出 文件上传到哪里&#xff1f; 怎么读取上传的文件&#xff1f; 第一步&#xff1a;试探上传文件位置 直接用burp抓包&#xff0c;…

P4727 [HNOI2009] 图的同构计数

B u r n s i d e &#xff1a; ∣ X / G ∣ 1 ∣ G ∣ ∑ g ∈ G ∣ X ( g ) ∣ Burnside&#xff1a;|X/G|\frac{1}{|G|}\sum\limits_{g\in G}|X^{(g)}| Burnside&#xff1a;∣X/G∣∣G∣1​g∈G∑​∣X(g)∣ 该题&#xff1a; ∣ X / G ∣ 1 ∣ G ∣ ∑ b 2 k Π ( b i …

Ubantu 20.04 卸载与安装 MySQL 5.7 详细教程

文章目录 卸载 MySQL安装 MySQL 5.71.获取安装包2.解压并安装依赖包3.安装 MySQL4.启动 MySQL 扩展开启 gtid 与 binlog 卸载 MySQL 执行以下命令即可一键卸载&#xff0c;包括配置文件目录等。 # 安装sudo软件 apt-get install sudo -y # 卸载所有以"mysql-"开头的…

软件工程(1、2;5~7小测参考答案)

目录 软件工程第1、2章小测 需求工程第5-7章小测 软件工程第1、2章小测 一 单项选择题(12分) 1、下列关于软件开发的描述不正确的是()。(1分) 软件是独立于计算机硬件的一部分,但它又依赖于计算机硬件。 软件既是一种复杂的逻辑实体,又是一种工具。 软件的核心是程序,…

区间dp--石子合并

题目表示 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。 举例1: 2,4,5 总代价最小值为17 举例2: 4,1,1,4 总代…

【Linux】工具:gcc/g++ 升级 7.3 版本

安装语言信息 sudo yum install -y centos-release-scl-rh centos-release-scl安装 7.3 版本 gcc 和 g 编译器 sudo yum install -y devtoolset-7-gcc devtoolset-7-gcc-c加载配置文件 临时生效 source /opt/rh/devtoolset-7/enable 将相应内容重定向到配置文件中&#xff…