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实现打地鼠小游戏相关推荐
- Python 和 PyQt5 实现打地鼠小游戏
Python 和 PyQt5 实现打地鼠小游戏 实现效果: 视频效果: https://live.csdn.net/v/264602https://live.csdn.net/v/264602 代码: ...
- PyQt5 打地鼠小游戏 代码及素材
主要知识点:QWidget,QPushButton,QTimer 计时器 说明:学 Qt 时的第一个小练习,只做了最基础简单的功能. 效果如下: (注:鼠标点击时黄色圆圈是 录屏软件自带的) 完整代码 ...
- java 打地鼠 源代码_Java实现的打地鼠小游戏完整示例【附源码下载】
本文实例讲述了Java实现的打地鼠小游戏.分享给大家供大家参考,具体如下: 这里涉及到java线程和GUI的相关知识,一个简单的java小游戏打地鼠,有兴趣的朋友可以优化一下.先来看看运行效果: 具体 ...
- 敲地鼠java_Java实现的打地鼠小游戏完整示例【附源码下载】
本文实例讲述了Java实现的打地鼠小游戏.分享给大家供大家参考,具体如下: 这里涉及到java线程和GUI的相关知识,一个简单的java小游戏打地鼠,有兴趣的朋友可以优化一下.先来看看运行效果: 具体 ...
- java android 打地鼠_Android实现打地鼠小游戏
本文实例为大家分享了Android实现打地鼠小游戏的具体代码,供大家参考,具体内容如下 实现结果 代码实现 playmouse.java package com.example.playmouse; ...
- 如何用python制作五子棋游戏_Python制作打地鼠小游戏
原文链接 Python制作小游戏(二十一)mp.weixin.qq.com 效果展示 打地鼠小游戏https://www.zhihu.com/video/1200492442610450432 简介 ...
- 【180730】WinForm打地鼠小游戏源码
本源码是采用WinForm进行开发的一个并非简单的打地鼠小游戏,有动画效果哈!有打地鼠.计分.过关等功能. 菜单功能: 1.运行游戏后,输入玩家姓名,点击开始 2.用鼠标点击从洞中钻出的地鼠给予打击 ...
- android打地鼠设计报告,android开发中利用handler制作一个打地鼠小游戏
android开发中利用handler制作一个打地鼠小游戏 发布时间:2020-11-25 15:21:11 来源:亿速云 阅读:136 作者:Leah 这期内容当中小编将会给大家带来有关androi ...
- linux打地鼠游戏代码,JavaScript实现打地鼠小游戏
一.实验说明 1. 环境介绍 本实验环境采用Ubuntu Linux桌面环境,实验中会用到桌面上的程序: Xfce终端: Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 Fir ...
- matlab制作打地鼠游戏,Python制作打地鼠小游戏
原标题:Python制作打地鼠小游戏 导语 大家好,欢迎来到 Crossin的编程教室 ! 打地鼠游戏相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~ 今天就给大家分享一个 ...
最新文章
- AI 帮忙找 Bug ,英特尔开源代码编程工具 ControlFlag
- Angualr6表单提交验证并跳转
- 什么时候应该避免写代码注释?
- 【2018.4.7】模拟赛之二-ssl2383 睡眠【水题】
- java解析上的jar包里的pom_Maven引入本地Jar包并打包进War包中的方法
- RECOLL检索软件测试工资,Recoll桌面全文搜索工具
- Mybatis_day4_Mybatis的注解开发
- 关于中断和异常的几点认识
- java restsharp_RestSharp使用总结
- HTTP网络协议四:HTTP报文及报文字段说明
- 基于Spring Boot的人力资源管理系统
- 〖四信智慧方案〗LoRa无线技术在输电监测中的应用
- phpStudy安装框架教程
- 目标检测——手把手带你实现SSD(Single Shot MultiBox Detector)训练和检测自己的数据集
- 计算机看游戏显卡,如何看电脑显卡性能
- 文献关联分析图谱——connected papers网站
- 知识图谱发展历程简介
- intouch报表数据的获取
- BIOS 中断向量表
- 往后余生的计算机音乐,纯音乐《飞翔的梦》 往后余生,与你同行