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()<<"碰撞";
}
}
}
用到的资源图片:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)