野路子玩Qt,第三十一集,擦玻璃游戏

野路子玩Qt,第三十一集,擦玻璃游戏,第1张

https://live.csdn.net/v/199805

擦玻璃小游戏

这个例子,最简化了Qt开发小游戏的逻辑和思路,

图形元素--》场景--》视图
QGraphicsItem--》QGraphicsScene--》QGraphicsView

图形元素:小蚂蚁,抹布,背景图片

代码:

pro文件添加 :

QT       += core gui multimedia

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 

#include 

#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    //生成蚂蚁
    void CreateMaYi();

    //碰撞检测函数
    void Collison();


private:
    Ui::Widget *ui;

    QGraphicsView mGameView;//游戏视图
    QGraphicsScene mScene;//游戏场景
    QGraphicsPixmapItem mBackGround1;//背景图片1
    QGraphicsPixmapItem mMabu;//抹布

    //媒体播放背景音乐
    QMediaPlayer *player;
    QMediaPlaylist *playlist;


    //定时器
    QTimer *mMaYiCreateTimer;//蚂蚁生成定时器
    QTimer *mCollisonTimer;//碰撞检测


    //容器
    QList mMaYiList;//蚂蚁容器,装说有蚂蚁

};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //图形元素--》场景--》视图


    //播放背景音乐
    player=new QMediaPlayer;
    playlist = new QMediaPlaylist;
    playlist->setPlaybackMode(QMediaPlaylist::Loop);// 通过设置 播放列表循环 实现循环播放

    playlist->addMedia(QUrl("qrc:/img/caboli.mp3"));
    player->setPlaylist(playlist);
    player->setVolume(100);
    player->play();


    this->setFixedSize(800,800);//设置窗体大小

    mGameView.setSceneRect(QRect(0,0,800,800));//设置视图,矩形大小
    mScene.setSceneRect(QRect(0,0,800,800));//设置场景,矩形大小

    mBackGround1.setPixmap(QPixmap(":/img/img/boli.jpg"));//设置背景图片

    mMabu.setPixmap(QPixmap(":/img/img/mabu.png"));//设置抹布
    mMabu.setFlag(QGraphicsItem::ItemIsMovable);//支持鼠标拖动
    mMabu.setPos(500,500);//设置抹布位置
    mMabu.setZValue(1);//设置抹布为上层

     //图片元素添加到场景
     mScene.addItem(&mBackGround1);//添加背景图片1
     mScene.addItem(&mMabu);//添加抹布图片

     //设置视图场景
     mGameView.setScene(&mScene);

     //设置视图的父亲为窗口
     mGameView.setParent(this);
     //显示视图
     mGameView.show();

    //开启蚂蚁创建定时器
     mMaYiCreateTimer = new QTimer(this);
     mMaYiCreateTimer->start(2000);
    connect(mMaYiCreateTimer,&QTimer::timeout,this,&Widget::CreateMaYi);

    //开启碰撞检测定时器
    mCollisonTimer = new QTimer(this);
    mCollisonTimer->start(100);
    connect(mCollisonTimer,&QTimer::timeout,this,&Widget::Collison);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::CreateMaYi()//生成蚂蚁
{
    QGraphicsPixmapItem *mMayi = new QGraphicsPixmapItem;//蚂蚁
    QPixmap pixmap(":/img/img/mayi.png");
    mMayi->setPixmap(pixmap);
    int randX = qrand()%(800-pixmap.width());//随机生成蚂蚁起始X位置
    int randY = qrand()%(800-pixmap.height());//随机生成蚂蚁起始Y位置
    mMayi->setPos(QPoint(randX,randY));

    //添加到场景
    mScene.addItem(mMayi);

    //添加到管理器
    mMaYiList.append(mMayi);
}

void Widget::Collison()//碰撞检测函数
{
    //遍历蚂蚁容器
    for(int i=0; i < mMaYiList.size(); i++ )
    {
            if(mMabu.collidesWithItem(mMaYiList[i]))
            {
                //移除场景
                mScene.removeItem(mMaYiList[i]);

                //移除管理器
                mMaYiList.removeOne(mMaYiList[i]);

                qDebug()<<"碰撞";
            }
    }
}

 用到的资源图片:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/713594.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存