当前位置: 首页 > news >正文

【Qt】游戏场景和图元

一:图元

advance函数:

在 Qt 框架里,QGraphicsItem 是用于在 QGraphicsScene 中绘制图形项的基类。advance(int phase) 是 QGraphicsItem 类的一个虚函数,其主要用途是让图形项在场景的动画或更新过程里完成特定的逻辑操作。

phase 是一个整数参数,一般有两个阶段:

  • phase 为 0 时:代表预更新阶段,此阶段图形项能够为即将到来的更新做准备,像计算新的位置、状态等。
  • phase 为 1 时:代表主更新阶段,在这个阶段图形项可以依据预更新阶段的计算结果来更新自身的状态和外观。

#include "gameitem.h"GameItem::GameItem(QString filepath,bool isMove):QGraphicsItem()
{this->state=0;//图元读取一张图片才可以响应this->img.load(filepath);this->isMove=isMove;this->index=0;if( this->isMove==true){this->standPng=filepath;}}void GameItem::advance(int phase)
{if(this->state==1){this->img.load(this->standPng);}else {if(this->isMove){//替换QString path=QString("img/mario/marioR/%1.png").arg(index);this->img.load(path);//mapToScene告诉场景要移动多少this->setPos(mapToScene(3,0));this->index=(this->index+1)%21;//是否碰撞if(collidingItems().count()>0){this->img.load(this->standPng);this->setPos(mapToScene(-3,0));}}}}//让场景知道这个图元占用场景多少范围
QRectF GameItem::boundingRect() const
{return QRectF(0,0,img.width(),img.height());
}//让场景知道如何绘制这个图
void GameItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{painter->drawPixmap(0,0,img.width(),img.height(),img);}void GameItem::setState(int value)
{state = value;
}

二、场景

#include "gameview.h"GameView::GameView():QGraphicsView()
{this->setFixedSize(1333,364);this->setWindowTitle("Super Mario");this->setWindowIcon(QIcon("img/wm.png"));this->init();
}void GameView::init()
{//背景图片this->setBackgroundBrush(QBrush(QPixmap("img/background.png").scaled(1333,364)));//舞台this->gameScene=new QGraphicsScene;this->setScene(this->gameScene);//设置场景与视图坐标相同this->setSceneRect(0,0,this->width(),this->height());//隐藏滚动条this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//创建图元(演员)this->floor=new GameItem("img/ground.png",false);this->gameScene->addItem(this->floor);this->floor->setPos(0,291);//位置this->maro=new GameItem("img/mario/marioR/stand.png",true);this->gameScene->addItem(this->maro);this->maro->setPos(0,223);this->block=new GameItem("img/normalwall.png",false);this->gameScene->addItem(this->block);this->block->setPos(500,191);//计时器对象this->timer=new QTimer;this->timer->start(100);//启动计时器//计时相应槽函数connect(this->timer,SIGNAL(timeout()),this,SLOT(autoMove()));
}void GameView::autoMove()
{this->gameScene->advance();
}//当前键盘事件
void GameView::keyPressEvent(QKeyEvent *event)
{switch (event->key()){case Qt::Key_Right:this->maro->setState(0);this->gameScene->advance();break;}
}void GameView::keyReleaseEvent(QKeyEvent *event)
{
//    switch (event->key())
//    {
//    case Qt::Key_Right:
//        this->maro->setState(1);
//        this->gameScene->advance();
//        break;
//    }}


http://www.mrgr.cn/news/96408.html

相关文章:

  • RK3588,V4l2 读取Gmsl相机, Rga yuv422转换rgb (mmap)
  • Python3基础库入门(个人学习用)
  • 图解AUTOSAR_SWS_SynchronizedTimeBaseManager
  • 链表(C++)
  • 通信协议之串口
  • Java - 2. 面向对象编程
  • openwrt24.10.0版本上安装istoreOS的屏幕监控插件
  • SpringBoot (一) 自动配置原理
  • pyinstaller 对 pyexecjs模块打包老会有终端框闪烁
  • MySQL多表查询实验
  • GHCTF-web-wp
  • Linux进程管理之子进程的创建(fork函数)、子进程与线程的区别、fork函数的简单使用例子、子进程的典型应用场景、父进程等待子进程结束后自己再结束
  • PwnMe CTF 2025 web
  • 高等数学-第七版-上册 选做记录 习题7-4
  • python学习笔记(3)——元组
  • 网络华为HCIA+HCIP 策略路由,双点双向
  • 【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,并实现远程联机,详细教程
  • docker启动nacos+redis+seata
  • IO模型之于并发编程模型、并发模型之于架构模式
  • 【SPP】蓝牙串口协议(SPP)深度解析:从 RS232 仿真到设备互联的技术实现