基于Qt實(shí)現(xiàn)電子木魚小游戲
前言
今年最火爆的解壓小游戲電子木魚,現(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)文章
C/C++ 實(shí)現(xiàn)簡(jiǎn)易HTTP服務(wù)器的示例
這篇文章主要介紹了C/C++ 實(shí)現(xiàn)簡(jiǎn)易HTTP服務(wù)器的示例,幫助大家更好的理解和學(xué)習(xí)C/C++編程,感興趣的朋友可以了解下2020-10-10C語(yǔ)言中計(jì)算字符串長(zhǎng)度與分割字符串的方法
這篇文章主要介紹了C語(yǔ)言中計(jì)算字符串長(zhǎng)度與分割字符串的方法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08詳解設(shè)計(jì)模式中的模板方法模式及在C++中的使用
這篇文章主要介紹了設(shè)計(jì)模式中的模板方法模式及在C++中的使用,模板方法將邏輯封裝到一個(gè)類中,并采取組合(委托)的方式解決這個(gè)問(wèn)題,需要的朋友可以參考下2016-03-03c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作
這篇文章主要介紹了c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12一篇文章帶你了解C語(yǔ)言二分查找的簡(jiǎn)單應(yīng)用
這篇文章主要介紹了二分查找算法在C語(yǔ)言程序中的使用示例,文中最后提到了使用二分查找法一個(gè)需要注意的地方,需要的朋友可以參考下2021-08-08C語(yǔ)言實(shí)現(xiàn)點(diǎn)菜系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)點(diǎn)菜系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06