基于Qt实现电子木鱼小游戏

 更新时间:2023年01月03日 16:26:50   作者:今天你debug了嘛?  
今年最火爆的解压小游戏电子木鱼,现在许多软件都上架了这个小程序。我在网上看了一下基本上都是用py和Java写的,所以我用QT重新写了一下,作为小白练手项目非常适合,快跟随小编一起学习一下吧

前言

今年最火爆的解压小游戏电子木鱼,现在许多软件都上架了这个小程序。我在网上看了一下基本上都是用py和Java写的,所以我用QT重新写了一下,作为小白练手项目非常适合

一、界面展示

二、功能模块

功能设计

鼠标点击和释放事件,模拟敲打木鱼动作

每一次的敲打木鱼都会缩小和放大一次

并且在木鱼上方显示出"功德+1"字样和播放一次敲打木鱼的声音

背景音乐一直播放

设置一个按钮为自动敲击木鱼

设置一个按钮为背景音乐的开关

1) 木鱼缩放

我是使用的一个label来放图片

缩小的原理是在现有木鱼图片大小上长和宽都同时缩小一个比例m

因为是按照中心点不变的缩小

所以左上点pos的坐标下降m/2

放大同理

// m =  10 图签放大,pos点上移.
// m =  -10 图签缩小,pos点下移.
void Widget::MuYu(int m)
{
    //获取当前label图片宽
    int currentWidth = ui->label->width();
    //获取当前label图片高
    int currentHeight = ui->label->height();
    //改变图片大小
    currentWidth += m;
    currentHeight += m;
    //在标签上重新设置图片大小和图片起始位置
    ui->label->setGeometry(ui->label->pos().x()-m/2,ui->label->pos().y()-m/2,currentWidth, currentHeight);
}

2) 功德+1 显示

用一个label设置文字 “功德+1”

这里文字出现的位置可以是随机的也可以定点出现

随机出现可以跟踪鼠标点击的位置

定点出现要提前写一个QPoint指定地点 (示例这个方式)

每一次出现后先上移一定位置(会使用QT动画函数 QPropertyAnimation ),然后消失

void Widget::gongde()
{
    ui->label_2->setText("功德+1");
    //QPropertyAnimation *m_TopPropertyAnimation;
    //绑定要移动的label对象
    m_TopPropertyAnimation->setTargetObject(ui->label_2);
    //设置按pos属性移动
    m_TopPropertyAnimation->setPropertyName("pos");
    // set 动画的起点、终点、持续时间
    m_TopPropertyAnimation->setDuration(600);
    m_TopPropertyAnimation->setStartValue(pos);
    m_TopPropertyAnimation->setEndValue(pos+QPoint(0, -120));
    // 启动和结束
    m_TopPropertyAnimation->start();
    //这里加一个延时函数避免,避免动画没有结束直接清除文字
    Delay(600);
    //清除文字
    ui->label_2->clear();
}

3) 音乐

背景音乐BGM<<大悲咒>>直接功德加满

void Widget::bgMusice()
{
    //QMediaPlayer *bg_player;
    qDebug()<<"dmz";
    //BACKMUSICE 宏定义文件路径
    bg_player->setMedia(QUrl::fromLocalFile(BACKMUSICE));
    bg_player->setVolume(10);
    bg_player->play();
    // 槽函数 监听QMediaPlayer::mediaStatusChanged信号 实现背景音乐循环播放
    connect(bg_player, &QMediaPlayer::mediaStatusChanged,this,&Widget::initStatus);
}
void Widget::initStatus(QMediaPlayer::MediaStatus status)
{
    if(status == QMediaPlayer::EndOfMedia)
        {
            bg_player->setPosition(0);
            bg_player->play();
        }
}

敲击木鱼声音

void Widget::MuYuMusice()
{
    //QMediaPlayer *MuYu_player;
    //设置要播放的媒体
    //MUYUMUSICE宏定义文件路径
    MuYu_player->setMedia(QUrl::fromLocalFile(MUYUMUSICE));
    //设置音量
    MuYu_player->setVolume(50);
    //播放
    MuYu_player->play();
}

4) 自动

写个槽函数,定时器定时触发,可以绑定滑杆设置一个敲打频率,同理可以调节背景音乐大小

void Widget::Auto()
{
    qDebug()<<"Auto";
    //图片缩小
    MuYu(-10);
    //敲到木鱼声音
    MuYuMusice();
    //功德+1文字
    gongde();
    //图片放大
    MuYu(10);
}

5) 延时

void Widget::Delay(int delay_time)
{
    QEventLoop loop;
    QTimer::singleShot(delay_time,&loop,SLOT(quit()));
    loop.exec();
}

三、完整代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QRect>
#include <QPropertyAnimation>
#include <QMediaPlayer>
#include <QTime>
#include <QTimer>
#include <QSystemTrayIcon>
#include <QLabel>
#include <QPainter>
#include <QRect>

#define WIDTH 480
#define HEIGH 640
#define MUYUMUSICE "C:\\Users\\Liu\\Desktop\\code\\QT\\muyu\\untitled\\musice\\muyu.mp3"
#define BACKMUSICE "C:\\Users\\Liu\\Desktop\\code\\QT\\muyu\\untitled\\musice\\bg.mp3"
#define ICON ":/img/muy.ico"

QT_BEGIN_NAMESPACE

namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void mousePressEvent(QMouseEvent *event);   //点击
    void mouseReleaseEvent(QMouseEvent *event); //释放
    void MuYu(int);
    void gongde();
    void MuYuMusice();
    void bgMusice();
    void Delay(int);
    void tray();
    void initStatus(QMediaPlayer::MediaStatus status); // 槽函数 监听QMediaPlayer::mediaStatusChanged信号
private slots:
    void on_toolButton_2_clicked(bool checked);
    void on_toolButton_clicked(bool checked);
    void Auto();

private:
    Ui::Widget *ui;
    QMediaPlayer *MuYu_player;
    QMediaPlayer *bg_player;
    QPoint pos;
    QPropertyAnimation *m_TopPropertyAnimation;
    QTimer *timer;
    QSystemTrayIcon *m_systemTray;
    int conut=0;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMouseEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    setMouseTracking(true);
    ui->setupUi(this);
    bg_player = new QMediaPlayer;
    MuYu_player = new QMediaPlayer;

    this->setWindowTitle("电子木鱼");
    this->setFixedSize(WIDTH,HEIGH);
    this->setWindowIcon(QIcon(ICON));
    m_TopPropertyAnimation = new QPropertyAnimation(this);
    pos=ui->label_2->pos();

    timer = new QTimer;
    connect(timer,SIGNAL(timeout()),this,SLOT(Auto()));
    bgMusice();
    tray();

}

Widget::~Widget()
{
    delete ui;
}

void Widget::tray()
{
    m_systemTray = new QSystemTrayIcon(this);
    m_systemTray->setIcon(QIcon(ICON));
    m_systemTray->setToolTip("SystemTray Program");
    m_systemTray->show();
}

// m=10 图签放大 pos点上移
// m=-10 图签缩小 pos点下移
void Widget::MuYu(int m)
{
    //获取当前label图片宽
    int currentWidth = ui->label->width();
    //获取当前label图片高
    int currentHeight = ui->label->height();
    //改变图片大小
    currentWidth += m;
    currentHeight += m;
    //在标签上重新设置图片大小和图片起始位置
    ui->label->setGeometry(ui->label->pos().x()-m/2,ui->label->pos().y()-m/2,currentWidth, currentHeight);
}
void Widget::MuYuMusice()
{
    //设置要播放的媒体
    MuYu_player->setMedia(QUrl::fromLocalFile(MUYUMUSICE));
    //设置音量
    MuYu_player->setVolume(50);
    //播放
    MuYu_player->play();
}

void Widget::bgMusice()
{
    qDebug()<<"dmz";
    bg_player->setMedia(QUrl::fromLocalFile(BACKMUSICE));
    bg_player->setVolume(10);
    bg_player->play();
    // 槽函数 监听QMediaPlayer::mediaStatusChanged信号 实现背景音乐循环播放
    connect(bg_player, &QMediaPlayer::mediaStatusChanged,this,&Widget::initStatus);
}
void Widget::initStatus(QMediaPlayer::MediaStatus status)
{
    if(status == QMediaPlayer::EndOfMedia)
        {
            bg_player->setPosition(0);
            bg_player->play();
        }
}

void Widget::gongde()
{
    ui->label_2->setText("功德+1");
    // bind
    m_TopPropertyAnimation->setTargetObject(ui->label_2);
    m_TopPropertyAnimation->setPropertyName("pos");
    // set 动画的起点、终点、持续时间
    m_TopPropertyAnimation->setDuration(600);
    m_TopPropertyAnimation->setStartValue(pos);
    m_TopPropertyAnimation->setEndValue(pos+QPoint(0, -120));
    // 启动和结束
    m_TopPropertyAnimation->start();
    Delay(600);
    ui->label_2->clear();
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<"press";
    MuYu(-10);
    MuYuMusice();
    gongde();
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug()<<"release";
    MuYu(10);
}

void Widget::on_toolButton_clicked(bool checked)
{
    if (checked) {
        timer->start(500);
    }
    else {
        timer->stop();
    }
}

void Widget::on_toolButton_2_clicked(bool checked)
{
    if(checked)
    {
        bg_player->stop();
    }else {
        bg_player->play();
    }
}

void Widget::Auto()
{
    qDebug()<<"Auto";
    MuYu(-10);
    MuYuMusice();
    gongde();
    MuYu(10);
}

//延时
void Widget::Delay(int delay_time)
{
    QEventLoop loop;
    QTimer::singleShot(delay_time,&loop,SLOT(quit()));
    loop.exec();
}

到此这篇关于基于Qt实现电子木鱼小游戏的文章就介绍到这了,更多相关Qt电子木鱼内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中MFC Tab Control控件的使用详解

    C++中MFC Tab Control控件的使用详解

    这篇文章主要介绍了C++中MFC Tab Control控件的使用详解的相关资料,需要的朋友可以参考下
    2015-06-06
  • Qt实现串口助手

    Qt实现串口助手

    这篇文章主要为大家详细介绍了Qt实现串口助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C/C++ 实现简易HTTP服务器的示例

    C/C++ 实现简易HTTP服务器的示例

    这篇文章主要介绍了C/C++ 实现简易HTTP服务器的示例,帮助大家更好的理解和学习C/C++编程,感兴趣的朋友可以了解下
    2020-10-10
  • C++中读写txt文件并分离字符的方法

    C++中读写txt文件并分离字符的方法

    今天小编就为大家分享一篇C++中读写txt文件并分离字符的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C语言中计算字符串长度与分割字符串的方法

    C语言中计算字符串长度与分割字符串的方法

    这篇文章主要介绍了C语言中计算字符串长度与分割字符串的方法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C语言解决螺旋矩阵算法问题的代码示例

    C语言解决螺旋矩阵算法问题的代码示例

    这篇文章主要介绍了C语言解决螺旋矩阵算法问题的代码示例,螺旋矩阵中的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环...需要的朋友可以参考下
    2016-04-04
  • 详解设计模式中的模板方法模式及在C++中的使用

    详解设计模式中的模板方法模式及在C++中的使用

    这篇文章主要介绍了设计模式中的模板方法模式及在C++中的使用,模板方法将逻辑封装到一个类中,并采取组合(委托)的方式解决这个问题,需要的朋友可以参考下
    2016-03-03
  • c/c++ 利用sscanf进行数据拆分操作

    c/c++ 利用sscanf进行数据拆分操作

    这篇文章主要介绍了c/c++ 利用sscanf进行数据拆分操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 一篇文章带你了解C语言二分查找的简单应用

    一篇文章带你了解C语言二分查找的简单应用

    这篇文章主要介绍了二分查找算法在C语言程序中的使用示例,文中最后提到了使用二分查找法一个需要注意的地方,需要的朋友可以参考下
    2021-08-08
  • C语言实现点菜系统

    C语言实现点菜系统

    这篇文章主要为大家详细介绍了C语言实现点菜系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论