QT--QGraphicsView Whac-A-Mole 打地鼠(2)

(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;
}

这样就完成了打击老鼠的效果。
剩下只有各按钮和显示分数的功能未实现了
明天继续

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值