欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Qt實(shí)現(xiàn)電子木魚小游戲

 更新時(shí)間:2023年01月03日 16:26:50   作者:今天你debug了嘛?  
今年最火爆的解壓小游戲電子木魚,現(xiàn)在許多軟件都上架了這個(gè)小程序。我在網(wǎng)上看了一下基本上都是用py和Java寫的,所以我用QT重新寫了一下,作為小白練手項(xiàng)目非常適合,快跟隨小編一起學(xué)習(xí)一下吧

前言

今年最火爆的解壓小游戲電子木魚,現(xiàn)在許多軟件都上架了這個(gè)小程序。我在網(wǎng)上看了一下基本上都是用py和Java寫的,所以我用QT重新寫了一下,作為小白練手項(xiàng)目非常適合

一、界面展示

二、功能模塊

功能設(shè)計(jì)

鼠標(biāo)點(diǎn)擊和釋放事件,模擬敲打木魚動(dòng)作

每一次的敲打木魚都會(huì)縮小和放大一次

并且在木魚上方顯示出"功德+1"字樣和播放一次敲打木魚的聲音

背景音樂(lè)一直播放

設(shè)置一個(gè)按鈕為自動(dòng)敲擊木魚

設(shè)置一個(gè)按鈕為背景音樂(lè)的開關(guān)

1) 木魚縮放

我是使用的一個(gè)label來(lái)放圖片

縮小的原理是在現(xiàn)有木魚圖片大小上長(zhǎng)和寬都同時(shí)縮小一個(gè)比例m

因?yàn)槭前凑罩行狞c(diǎn)不變的縮小

所以左上點(diǎn)pos的坐標(biāo)下降m/2

放大同理

// m =  10 圖簽放大,pos點(diǎn)上移.
// m =  -10 圖簽縮小,pos點(diǎn)下移.
void Widget::MuYu(int m)
{
    //獲取當(dāng)前l(fā)abel圖片寬
    int currentWidth = ui->label->width();
    //獲取當(dāng)前l(fā)abel圖片高
    int currentHeight = ui->label->height();
    //改變圖片大小
    currentWidth += m;
    currentHeight += m;
    //在標(biāo)簽上重新設(shè)置圖片大小和圖片起始位置
    ui->label->setGeometry(ui->label->pos().x()-m/2,ui->label->pos().y()-m/2,currentWidth, currentHeight);
}

2) 功德+1 顯示

用一個(gè)label設(shè)置文字 “功德+1”

這里文字出現(xiàn)的位置可以是隨機(jī)的也可以定點(diǎn)出現(xiàn)

隨機(jī)出現(xiàn)可以跟蹤鼠標(biāo)點(diǎn)擊的位置

定點(diǎn)出現(xiàn)要提前寫一個(gè)QPoint指定地點(diǎn) (示例這個(gè)方式)

每一次出現(xiàn)后先上移一定位置(會(huì)使用QT動(dòng)畫函數(shù) QPropertyAnimation ),然后消失

void Widget::gongde()
{
    ui->label_2->setText("功德+1");
    //QPropertyAnimation *m_TopPropertyAnimation;
    //綁定要移動(dòng)的label對(duì)象
    m_TopPropertyAnimation->setTargetObject(ui->label_2);
    //設(shè)置按pos屬性移動(dòng)
    m_TopPropertyAnimation->setPropertyName("pos");
    // set 動(dòng)畫的起點(diǎn)、終點(diǎn)、持續(xù)時(shí)間
    m_TopPropertyAnimation->setDuration(600);
    m_TopPropertyAnimation->setStartValue(pos);
    m_TopPropertyAnimation->setEndValue(pos+QPoint(0, -120));
    // 啟動(dòng)和結(jié)束
    m_TopPropertyAnimation->start();
    //這里加一個(gè)延時(shí)函數(shù)避免,避免動(dòng)畫沒(méi)有結(jié)束直接清除文字
    Delay(600);
    //清除文字
    ui->label_2->clear();
}

3) 音樂(lè)

背景音樂(lè)BGM<<大悲咒>>直接功德加滿

void Widget::bgMusice()
{
    //QMediaPlayer *bg_player;
    qDebug()<<"dmz";
    //BACKMUSICE 宏定義文件路徑
    bg_player->setMedia(QUrl::fromLocalFile(BACKMUSICE));
    bg_player->setVolume(10);
    bg_player->play();
    // 槽函數(shù) 監(jiān)聽(tīng)QMediaPlayer::mediaStatusChanged信號(hào) 實(shí)現(xiàn)背景音樂(lè)循環(huán)播放
    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;
    //設(shè)置要播放的媒體
    //MUYUMUSICE宏定義文件路徑
    MuYu_player->setMedia(QUrl::fromLocalFile(MUYUMUSICE));
    //設(shè)置音量
    MuYu_player->setVolume(50);
    //播放
    MuYu_player->play();
}

4) 自動(dòng)

寫個(gè)槽函數(shù),定時(shí)器定時(shí)觸發(fā),可以綁定滑桿設(shè)置一個(gè)敲打頻率,同理可以調(diào)節(jié)背景音樂(lè)大小

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

5) 延時(shí)

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);   //點(diǎn)擊
    void mouseReleaseEvent(QMouseEvent *event); //釋放
    void MuYu(int);
    void gongde();
    void MuYuMusice();
    void bgMusice();
    void Delay(int);
    void tray();
    void initStatus(QMediaPlayer::MediaStatus status); // 槽函數(shù) 監(jiān)聽(tīng)QMediaPlayer::mediaStatusChanged信號(hào)
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點(diǎn)上移
// m=-10 圖簽縮小 pos點(diǎn)下移
void Widget::MuYu(int m)
{
    //獲取當(dāng)前l(fā)abel圖片寬
    int currentWidth = ui->label->width();
    //獲取當(dāng)前l(fā)abel圖片高
    int currentHeight = ui->label->height();
    //改變圖片大小
    currentWidth += m;
    currentHeight += m;
    //在標(biāo)簽上重新設(shè)置圖片大小和圖片起始位置
    ui->label->setGeometry(ui->label->pos().x()-m/2,ui->label->pos().y()-m/2,currentWidth, currentHeight);
}
void Widget::MuYuMusice()
{
    //設(shè)置要播放的媒體
    MuYu_player->setMedia(QUrl::fromLocalFile(MUYUMUSICE));
    //設(shè)置音量
    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();
    // 槽函數(shù) 監(jiān)聽(tīng)QMediaPlayer::mediaStatusChanged信號(hào) 實(shí)現(xiàn)背景音樂(lè)循環(huán)播放
    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 動(dòng)畫的起點(diǎn)、終點(diǎn)、持續(xù)時(shí)間
    m_TopPropertyAnimation->setDuration(600);
    m_TopPropertyAnimation->setStartValue(pos);
    m_TopPropertyAnimation->setEndValue(pos+QPoint(0, -120));
    // 啟動(dòng)和結(jié)束
    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);
}

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

到此這篇關(guān)于基于Qt實(shí)現(xiàn)電子木魚小游戲的文章就介紹到這了,更多相關(guān)Qt電子木魚內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論