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


    目录

    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文件,进入构造函数中,进行场景的基本配置,代码如下: 

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

    运行效果如图:

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

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

    3.2 设置背景图片

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

    1. void MainScene::paintEvent(QPaintEvent *)
    2. {
    3. //创建画家,指定绘图设备
    4. QPainter painter(this);
    5. //创建QPixmap对象
    6. QPixmap pix;
    7. //加载图片
    8. pix.load(":/res/PlayLevelSceneBg.png");
    9. //绘制背景图
    10. painter.drawPixmap(0,0,this->width(),this->height(),pix);
    11. //加载标题
    12. pix.load(":/res/Title.png");
    13. //缩放图片
    14. pix = pix.scaled(pix.width()*0.5,pix.height()*0.5);
    15. //绘制标题
    16. painter.drawPixmap( 10,30,pix.width(),pix.height(),pix);
    17. }

    运行效果如图:

    3.3 创建开始按钮

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

     

    点击完成。

    修改MyPushButton的父类

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

    1. //normalImg 代表正常显示的图片
    2. //pressImg 代表按下后显示的图片,默认为空
    3. MyPushButton(QString normalImg,QString pressImg = "");
    4. QString normalImgPath; //默认显示图片路径
    5. QString pressedImgPath; //按下后显示图片路径
    6. 实现的重载版本MyPushButton构造函数代码如下:
    7. MyPushButton::MyPushButton(QString normalImg,QString pressImg)
    8. {
    9. //成员变量normalImgPath保存正常显示图片路径
    10. normalImgPath = normalImg;
    11. //成员变量pressedImgPath保存按下后显示的图片
    12. pressedImgPath = pressImg;
    13. //创建QPixmap对象
    14. QPixmap pixmap;
    15. //判断是否能够加载正常显示的图片,若不能提示加载失败
    16. bool ret = pixmap.load(normalImgPath);
    17. if(!ret)
    18. {
    19. qDebug() << normalImg << "加载图片失败!";
    20. }
    21. //设置图片的固定尺寸
    22. this->setFixedSize( pixmap.width(), pixmap.height() );
    23. //设置不规则图片的样式表
    24. this->setStyleSheet("QPushButton{border:0px;}");
    25. //设置图标
    26. this->setIcon(pixmap);
    27. //设置图标大小
    28. this->setIconSize(QSize(pixmap.width(),pixmap.height()));
    29. }

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

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

     运行效果如图:

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

    3.4 开始按钮跳跃特效实现

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

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

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

    1. void MyPushButton::zoom1()
    2. {
    3. //创建动画对象
    4. QPropertyAnimation * animation1 = new QPropertyAnimation(this,"geometry");
    5. //设置时间间隔,单位毫秒
    6. animation1->setDuration(200);
    7. //创建起始位置
    8. animation1->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));
    9. //创建结束位置
    10. animation1->setEndValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
    11. //设置缓和曲线,QEasingCurve::OutBounce 为弹跳效果 animation1->setEasingCurve(QEasingCurve::OutBounce);
    12. //开始执行动画
    13. animation1->start();
    14. }
    15. void MyPushButton::zoom2()
    16. {
    17. QPropertyAnimation * animation1 = new QPropertyAnimation(this,"geometry");
    18. animation1->setDuration(200);
    19. animation1->setStartValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
    20. animation1->setEndValue(QRect(this->x(),this->y(),this->width(),this->height()));
    21. animation1->setEasingCurve(QEasingCurve::OutBounce);
    22. animation1->start();
    23. }

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

    3.5 创建选择关卡场景

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

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

     

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

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

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

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

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

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

  • 相关阅读:
    MySQL数据类型
    Bio-MOF-100 金属有机骨架材料
    合数世纪 马蹄集
    Flink代码单词统计 ---批处理
    《算法通关村——不简单的字符串转换问题》
    HarmonyOS 鸿蒙隔离层设计
    业务出海必答题,融云全球通信网络技术挑战破解实践
    深浅拷贝原理+案例解析
    EPLAN_008#3D布局图
    php的伪协议详解
  • 原文地址:https://blog.csdn.net/cat_fish_rain/article/details/133529956