界面设计
首先在MainWindow上采用一个垂直布局。放入一个GraphicsView作为游戏的显示界面,放入一个LCD Number作为记分器,放入三个PushButton并分别修改他们的Text属性,改为“开始” “暂停” “停止”,并修改他们的objectName属性,改为btn_start btn_pulse btn_stop
填充背景
Qt填充Graphicsview的顺序是这样的:view-scene-item,所以我们要在GraphicsView中添加scene,在scene中添加item。这里我分别创建了MyScene和MyItem两个类,其中MyScene继承自QGraphicsScene,MyItem继承自QGraphicsPixmapItem。其中MyScene的私有属性有MyItem类型的长度为16的数组,因为画面大小是4X4,所以长度为16,每一个item对应场景中的一张图片。在MyItem中我定义了每张图片的背景(background图片)
并将光标改为了锤子(hammerUp图片)
重写了鼠标按下事件,使鼠标按下时候光标从hammerDown这张图片变成hammerUp这张图片。
弹出地鼠
先随机出数值为1-3的一个随机数,作为弹出地鼠的数量,在随机出一个数值为0-15的数,作为弹出地鼠的位置,同时在把backgrpung图片变为地鼠图片的时候,把MyItem中mouse属性设为true,这个属性是作为之后记分的依据。
记分
在MainWindow类中写了一个updateScore函数,每次接收到信号时,lcdNumber上的数字就变一次。
为了自定义一个信号,我创建了一个名为handler的类,采用单例模式,定义了信号函数beatMouse()和公有函数addScore(),每次调用这个addScore时函数都会发送beatMouse()信号。
在MyItem类中重写的鼠标按下事件函数中获取handler实例,如果mouse属性为true,则调用handler的addScore()函数记分。并且在MyItem中新增一个hit属性,这是为了防止鼠标连续点击同一个地鼠造成重复记分
三个PushButton的功能与其他杂项。
在MainWindow中重写关闭事件,使用户点击关闭时不会立刻关闭,而是弹出一个窗口询问用户是否确定要关闭
“开始” “暂停” “停止”按钮功能
先绑定信号与槽,startGame() pulseGame() stopGame()都是自己定义的槽函数
效果图
完整代码
handler.h
#ifndef HANDLER_H
handler.cpp
#include
mainwindow.h
#ifndef MAINWINDOW_H
maindow.cpp
#include
myitem.h
#ifndef MYITEM_H
myitem.cpp
#include
myscene.h
#ifndef MYSCENE_H
myscene.cpp
#include
main.cpp和默认的一致,就不放了