打地鼠游戏(5)
绑定开始、暂停、停止按钮,
先用之前的绑定方式来完成,对比后面介绍的一种方式。
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 6 #include "myscene.h" 7 8 namespace Ui { 9 class MainWindow; 10 } 11 12 class MainWindow : public QMainWindow 13 { 14 Q_OBJECT 15 16 public: 17 explicit MainWindow(QWidget *parent = nullptr); 18 ~MainWindow(); 19 20 virtual void closeEvent(QCloseEvent *event); 21 private slots: 22 void start_game(); //开始游戏 23 void hold_game(); //暂停游戏 24 void end_game(); //停止游戏 25 26 private: 27 Ui::MainWindow *ui; 28 MyScene * sc; 29 30 }; 31 32 #endif // MAINWINDOW_H
1 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) 2 { 3 ui->setupUi(this); 4 //将场景在容器中进行显式 5 this->sc = new MyScene(); 6 ui->graphicsView->setScene(this->sc); 7 8 //控件绑定 9 connect(this->ui->btn_begin,SIGNAL(clicked()),this,SLOT(start_game())); 10 connect(this->ui->btn_hold,SIGNAL(clicked()),this,SLOT(hold_game())); 11 connect(this->ui->btn_end,SIGNAL(clicked()),this,SLOT(end_game())); 12 13 }
1 void MainWindow::start_game(){ 2 this->sc->get_timer_handler()->start(1000); //开启定时器 3 } 4 void MainWindow::hold_game(){ 5 this->sc->get_timer_handler()->stop(); 6 } 7 void MainWindow::end_game(){ 8 //关闭定时器 9 this->sc->get_timer_handler()->stop(); 10 //图元恢复默认 11 for(int i = 0;i<16;i++){ 12 this->sc->get_item(i)->setPic(":/mouse/pic/bg1.png"); 13 this->sc->get_item(i)->setmouse(false); 14 } 15 //记分清零 16 }
这里在mainwindow类中去引用了this->sc,还要去写get_item(int i)方法来获取item[i],它是一个myscene的类,之所以会这样,是因为在connect的时候,指定的接收信号的对象是this,即mainwindow对象,其实可以一步到位,直接connect的时候,指定myscene对象接收信号:
1 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) 2 { 3 ui->setupUi(this); 4 //将场景在容器中进行显式 5 this->sc = new MyScene(); 6 ui->graphicsView->setScene(this->sc); 7 8 //控件绑定 9 connect(this->ui->btn_begin,SIGNAL(clicked()),this->sc,SLOT(start_game())); 10 connect(this->ui->btn_hold,SIGNAL(clicked()),this->sc,SLOT(hold_game())); 11 connect(this->ui->btn_end,SIGNAL(clicked()),this->sc,SLOT(end_game())); 12 13 }
1 #ifndef MYSCENE_H 2 #define MYSCENE_H 3 4 #include "myitem.h" 5 6 #include <QObject> 7 #include <QGraphicsScene> 8 #include <QTimer> 9 10 class MyScene : public QGraphicsScene 11 { 12 Q_OBJECT /*具备信号与槽能力的关键*/ 13 public: 14 explicit MyScene(QObject *parent = nullptr); 15 ~MyScene(); 16 17 signals: 18 19 public slots: 20 void update_my_item(); 21 void start_game(); //开始游戏 22 void hold_game(); //暂停游戏 23 void end_game(); //停止游戏 24 25 private: 26 myitem* item[16]; //当前一个场景由4x4个图元构成,每一个图元都是一张图片构成 27 QTimer* p_timer; //定时器 28 }; 29 30 #endif // MYSCENE_H
1 #include "myscene.h" 2 3 #include <stdlib.h> 4 #include <time.h> 5 6 MyScene::MyScene(QObject *parent) : QGraphicsScene(parent) 7 { 8 9 //添加图元到场景 10 for(int i = 0;i<16;i++){ 11 this->item[i] = new myitem(); 12 //设置坐标 13 /*一维数组转换为二维数组,下面宽、高的倍数组合 14 0 0,0 1,0 2,0 3 15 1 0,1 1,1 2,1 3 16 2 0,2 1,2 2,2 3 17 3 0,3 1,3 2,3 3 18 */ 19 double x = i/4 * this->item[i]->boundingRect().width(); 20 double y = i%4 * this->item[i]->boundingRect().height(); 21 this->item[i]->setPos(x,y); 22 this->addItem(this->item[i]); 23 } 24 25 //绑定一个定时器,等定时周期到触发一个随机数[0-15],然后让场景中的一个图元的图片更换 26 this->p_timer = new QTimer(); 27 connect(this->p_timer, SIGNAL(timeout()), this, SLOT(update_my_item())); //绑定定时器和槽函数 28 //this->p_timer->start(1000); //由于绑定了开始按钮,在点击开始按钮之后开启定时器 29 30 } 31 32 MyScene::~MyScene(){ 33 for(int i = 0;i<16;i++){ 34 delete this->item[i]; 35 } 36 delete this->p_timer; 37 } 38 39 40 void MyScene::update_my_item(){ 41 //每次出现老鼠之前,先恢复到所有图元为无老鼠的样式图片 42 for(int i = 0;i<16;i++){ 43 this->item[i]->setPic(":/mouse/pic/bg1.png"); 44 45 //同时需要恢复图元老鼠标识为默认 46 this->item[i]->setmouse(false); 47 } 48 49 srand(time(NULL)); //设置随机数种子 50 51 //一次性允许显式最多三个老鼠 52 int count = rand()%3 +1; 53 for(int k=1;k<=3;k++){ 54 int i = rand()%16; 55 this->item[i]->setPic(":/mouse/pic/mouse.png"); 56 57 //同时需要设置图元老鼠标识 58 this->item[i]->setmouse(true); 59 } 60 } 61 62 void MyScene::start_game(){ 63 this->p_timer->start(1000); //开启定时器 64 } 65 void MyScene::hold_game(){ 66 this->p_timer->stop(); 67 } 68 void MyScene::end_game(){ 69 //关闭定时器 70 this->p_timer->stop(); 71 //图元恢复默认 72 for(int i = 0;i<16;i++){ 73 this->item[i]->setPic(":/mouse/pic/bg1.png"); 74 this->item[i]->setmouse(false); 75 } 76 //记分清零 77 }
内在的趣味,表面的繁琐