本项目的下载地址:戳此访问
这一篇实现数码管的显示,鼠标的图标的改变和一种新的设计模式--单例模式.
这个终极篇拖了好久,着实惭愧.今夜是中秋佳节,所以今夜我就对这个打地鼠的小游戏做一个了断吧.
先介绍到单例模式.
所为单例模式就是C++编程的一个小技巧,它是全局变量的替代品.即我们定义一个类,使得这个类只能获得一个对象,
#ifndef HANDLER_H
#define HANDLER_H
#include <QObject>
class handler : public QObject
{
Q_OBJECT
public:
//静态不用实例化就可以之间调用
static handler* getInstance();//只能获得一个对象实现单例模式
void addScore();
private://改成private的目的是在类外不能新建对象实现数据的封闭
explicit handler(QObject *parent = nullptr);
signals:
void beatMouse();//人为发送信号,函数声明
private:
static handler* hand;
public slots:
};
#endif // HANDLER_H
handler.cpp为:
#include "handler.h"
handler::handler(QObject *parent) : QObject(parent)
{
}
handler* handler::hand = new handler;//静态成员变量的初始化方式
handler *handler::getInstance()
{
return hand;//具有全局变量的特性
}
void handler::addScore()
{
emit beatMouse();
}
有了handler类我们在mainwindow.cpp中添加进handler的头文件,然后在构造函数中初始化,进入添加信号与槽,定义分数变量用来显示在数码管中,具体如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<handler.h>//通过handler发射信号包含进来头文件
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new myScene(this);
this->ui->graphicsView->setScene(scene);//在容器内设置场景
//开始按钮的设置
connect(ui->btn_start,&QPushButton::clicked,this->scene,&myScene::startGame);
connect(ui->btn_pause,&QPushButton::clicked,this->scene,&myScene::pauseGame);
connect(ui->btn_end,&QPushButton::clicked,this->scene,&myScene::stopGame);
this->score = 0;//初始化为0
handler* hand = handler::getInstance(); //这一行代码是获取实例的意思,就是通过getInstance()函数获取hand对象
connect(hand,&handler::beatMouse,this,&MainWindow::updateScore);
}
显示分数的函数如下:
void MainWindow::updateScore()
{
this->score+=10;//每打一次加10分
this->ui->lcdNumber->display(this->score);//将打老鼠的次数显示在数码管上
}
至此数码管可以正常显示分数了.
随后更改鼠标点击的样式和打击老鼠时背景图的切换.
对于鼠标的样式,只要重写事件函数即可,分别在鼠标按下事件和鼠标抬起事件中添加语句:
this->setCursor(QCursor(QPixmap(":/mouse/picturedown.png")));
至此,打地鼠的项目就写完了,这个例子不是很简单,设计的东西很多,自己还需要多消化.