日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT实现打地鼠小游戏

發布時間:2023/12/16 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT实现打地鼠小游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
看吳健吳老師的視頻做了一個打地鼠的小游戲,主要利用了qt中的2D顯示器QGraphicsView, QGraphicsScence場景,以及圖元QgraphicsItem下的像素圖元QGraphicsPixmapItem。 關系為一個個圖元構成場景,場景顯示在顯示器中。

##效果如下(手機)

圖元類
圖元類主要設置每個圖元上的圖片是什么,該圖元的狀態(開始狀態和暫停、停止狀態),以及該圖元上是否有老鼠(通過一個bool類型的成員變量來決定);圖元類還需要設置置鼠標的狀態為一個錘子;圖元類還需要重寫父類的基類QGraphicsItem中的鼠標按壓事件和鼠標抬起事件。當鼠標按下時,如果在開始狀態下該圖元的mouse變量為true(有老鼠),則 說明打到了老鼠,此時利用獲取到的單例對象向mainwindow發送一個beat信號,更新lcdnumber上的分數。

#include "myitem.h" #include <QDebug> myitem::myitem() {this->setPixmap(QPixmap(":/pic/2"));//默認背景圖片mouse = false;//沒有老鼠start = false;//沒開始this->setCursor(QCursor(QPixmap(":/pic/up1.png")));//鼠標為錘子抬起形態 }void myitem::setpic(QString path) //用于設置該圖元的圖片 {this->setPixmap(QPixmap(path)); }void myitem::setmouse(bool m) //設置該圖元上是否有老鼠 {this->mouse = m; }bool myitem::ismouse()//返回該圖元上是否有老鼠 {return this->mouse; }void myitem::mousePressEvent(QGraphicsSceneMouseEvent *event)//鼠標點擊事件重寫,繼承自父類QGraphicItem{this->setCursor(QCursor(QPixmap(":/pic/down.png")));//鼠標點擊錘子落下if(this->start)//判斷是否是開始狀態{if(ismouse())//判斷是否有老鼠{this->setPixmap(QPixmap(":/pic/3"));//設置該圖元為擊中效果score* s = score::getscore();//獲取單例對象s->addscore();//通知加分}}}void myitem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)//鼠標釋放事件,錘子抬起{this->setCursor(QCursor(QPixmap(":/pic/up1.png")));}void myitem::setstart(bool m)//設置是否為開始狀態{this->start = m;}bool myitem::isstart(){return this->start;}

場景類
場景類首先要進行背景的布局,將圖元添加進場景并且依次排列成4*4的矩陣。然后需要設置定時器讓游戲動起來。然后設置開始、暫停、停止三個按鈕的槽函數(主要是改變定時器的狀態)。

#include "myscene.h"myScenr::myScenr(QObject *parent) : QGraphicsScene(parent) {int i = 0;for(i = 0;i<16;i++)//在該場景上添加(4*4)個圖元{itm[i] = new myitem;itm[i]->setPos(i/4 * itm[i]->boundingRect().width(),i%4 * itm[i]->boundingRect().height());this->addItem(itm[i]);//依次添加進場景}this->life_time = 2000;//初始化老鼠刷新時間this->mouse_count = 4;//初始化每次刷新的最大數量pt = new QTimer(this);//刷新老鼠的定時器ppt = new QTimer(this);//更新老鼠刷新速度和數量定時器connect(pt,SIGNAL(timeout()),this,SLOT(showmouse()));connect(ppt,SIGNAL(timeout()),this,SLOT(change_time())); }void myScenr::showmouse()//老鼠出動 {int count = rand()%this->mouse_count+1;//隨機數獲取出現幾只老鼠int i = 0;for( i = 0;i<16;i++)//老鼠出現之前上一波老鼠回洞{itm[i]->setpic(":/pic/2");itm[i]->setmouse(false);}for(i = 0;i < count;i++){int pos = rand()%16;//隨機數獲取老鼠出現在那個圖元itm[pos]->setpic(":/pic/4");itm[pos]->setmouse(true);} }void myScenr::change_time()//改變刷新速度和數量 {this->life_time -= 500;//每30s將刷新時間減小0.5s,一局游戲控制在2minthis->mouse_count += 2;if(this->life_time == 0)//如果時間耗盡,發送finshed信號{emit finshed();} }void myScenr::start()//開始 {int i = 0;for( i = 0;i<16;i++){itm[i]->setstart(true);//設置每一個圖元的start狀態}ppt->start(30000);//啟動定時器pt->start(this->life_time); }void myScenr::spause()//暫停 {pt->stop();ppt->stop();int i = 0;for( i = 0;i<16;i++){itm[i]->setstart(false);} }void myScenr::stop()//停止 {pt->stop();ppt->stop();this->life_time = 2000;this->mouse_count = 4;int i = 0;for( i = 0;i<16;i++){itm[i]->setpic(":/pic/2");itm[i]->setmouse(false);itm[i]->setstart(false);}emit clear();//向mainwindow發送停止清空分數信號 }

#單例
因為是否打到老鼠是在圖元上判斷的,而分數的顯示則在mainwindow里。所以設計了一個單例對象讓圖元和mainwindow都可以獲取到同一個對象。圖元類利用該對象發送beat信號,mainwindow則關聯beat信號和用來更新分數的槽函數。

#include <QObject> //單例 class score : public QObject {Q_OBJECT public:static score* getscore();void addscore(); private:explicit score(QObject *parent = nullptr);signals:void beat();//砸到老鼠后通知mainwindow加分public slots: private:static score *s; };

#mainwindow
mainwindow主要將場景加入顯示器、并設置彈窗(重寫關閉事件的函數、和一局游戲結束后的彈窗)、以及背景音樂的播放。

#源碼地址
https://gitee.com/hou_yuan_hao/whacamole

總結

以上是生活随笔為你收集整理的QT实现打地鼠小游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。