(1)的地址
https://blog.csdn.net/weixin_43086497/article/details/104660708
(3)的地址
https://blog.csdn.net/weixin_43086497/article/details/104758504
(2)
(1)中我们只显示一副背景图
现在我们要显示一个完整的背景,做一个3X3的
这里面相当于有九个图元,那我们就来到scene.h
构造一个数组,把这九个背景存在里面,依次显示
即把
class scene : public QGraphicsScene
{
Q_OBJECT
public:
explicit scene(QObject *parent = nullptr);
signals:
public slots:
private:
item * oneitem;
};
换成
class scene : public QGraphicsScene
{
Q_OBJECT
public:
explicit scene(QObject *parent = nullptr);
signals:
public slots:
private:
item * nightitem[3][3];
};
然后我们在scene.cpp里实现显示
为了正确显示位置
使用
void QGraphicsItem::setPos(const QPointF &pos)
来设定图元的位置
scene::scene(QObject *parent) : QGraphicsScene(parent)
{
int i = 0,j = 0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
this->nightitem[i][j] = new item;
this->nightitem[i][j]->setPos(i * this->nightitem[i][j]->boundingRect().width(),j * this->nightitem[i][j]->boundingRect().height());
this->addItem(this->nightitem[i][j]);
}
}
}
当中使用到
boundingRect().width()
boundingRect().height()
来获取图元的大小
改变鼠标形状
当我们打地鼠的时候,需要一个锤子,也就是我们鼠标进入游戏画面的时候,鼠标形状要变成锤子,锤子弹起和锤子落下
它属于图元的一部分,所以我们来到item.cpp
使用
void QGraphicsItem::setCursor(const QCursor &cursor)
来改变鼠标的形状
效果如图:
使用定时器让老鼠起来
这里第一,老鼠起来的时候我们更换图元
第二,定时并切随机让老鼠起来
为了方便在场景里面实现更换图元,所以我们在item里写一个函数
void setPic(QString path);
用这样一个函数实现更换图元
item.h
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneMouseEvent>
#include <QCursor>
#include <QString>
class item : public QGraphicsPixmapItem
{
public:
item();
void setPic(QString path);
void mouseReleaseEvent(QGraphicsSceneMouseEvent * event);
};
item.c
void item::setPic(QString path)
{
this->setPixmap(QPixmap(path));
}
在场景里使用定时器
在scene.h里包含头文件
#include <QObject>
#include <QGraphicsScene>
#include <item.h>
#include <QTimer>
#include <stdlib.h>
class scene : public QGraphicsScene
{
Q_OBJECT
public:
explicit scene(QObject *parent = nullptr);
signals:
public slots:
void showMouse();
private:
item * nightitem[3][3];
QTimer * ptimer;
};
并在private里定义一个定时器对象ptimer
这里我们同时声明一个showmouse函数,更换图元
包含stdlib头文件以生成随机数
在scene.cpp里实现showmouse函数
void scene::showMouse()
{
int i = rand()%3;
int j = rand()%3;
this->nightitem[i][j]->setPic(":/document/whacamolefile/beatmouse.png");
}
在scene里启动定时器,绑定showmouse函数
为了防止老鼠不断出现,所以需要在老鼠起来之前对背景重置一遍,也就是在showmouse函数里setpic之前把背景全部更换一遍
void scene::showMouse()
{
int i = rand()%3;
int j = rand()%3;
int k = 0,m = 0;
for(k=0;k<3;k++)
{
for(m=0;m<3;m++)
{
this->nightitem[k][m]->setPic(":/document/whacamolefile/bg1.png");
}
}
this->nightitem[i][j]->setPic(":/document/whacamolefile/beatmouse.png");
}
打老鼠,鼠标事件重写
我们直接鼠标点击游戏画面,所以我们要对鼠标按下和弹起的事件进行重写,让它出现我们想要的效果使用下面两个函数
void mouseReleaseEvent();
void mousePressEvent();
这属于item图元的内容,所以我们在图元里面对这两个事件进行重写
item.h
class item : public QGraphicsPixmapItem
{
public:
item();
void setPic(QString path);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void setMouse(bool mouse);
bool isMouse();
private:
bool mouse;
};
item.c
void item::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
this->setCursor(QCursor(QPixmap(":/document/whacamolefile/picturedown.png")));
if(this->isMouse()){
this->setPixmap(QPixmap(":/document/whacamolefile/was_hit.png"));
this->mouse = false;
}
}
void item::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
this->setCursor(QCursor(QPixmap(":/document/whacamolefile/pictureUp.png")));
}
这样就完成了打老鼠的时候锤子起落的效果
记得添加头文件
#include <QGraphicsSceneMouseEvent>
下面我们需要打中老鼠的时候让老鼠变成被打击的模样
所以我们同时在item.h里面添加两个函数,设置当前图元的状态,是老鼠还是背景
void setMouse(bool mouse);
bool isMouse();
在item.cpp里实现函数
void item::setMouse(bool mouse)
{
this->mouse = mouse;
}
bool item::isMouse()
{
return this->mouse;
}
这样就完成了打击老鼠的效果。
剩下只有各按钮和显示分数的功能未实现了
明天继续