QT实现小游戏场景滚动实践,实现靠一个图片给人看上去像在不断移动能动起来

准备一个图片素材

这里准备设计场景是从右向左滚动,所以需要准备一张左边和右边能衔接起来的图片

QT实现小游戏场景滚动实践_QT

编码实现

资源文件定义

res.qrc

<RCC>
    <qresource prefix="/">
        <file>res/img11.jpg</file>
    </qresource>
</RCC>

头文件

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

#define SCENE_WIDTH  700 //宽度
#define SCENE_HEIGHT 394  //高度

#define SCENE_RATE  10  //单位毫秒
#define MAP_PATH  ":/res/img11.jpg" //场景地图图片路径
#define MAP_PATH2  ":/res/img11.jpg" //场景地图图片路径

#define MAP_SCROLL_SPEED 2  //场景地图滚动速度

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void paintEvent(QPaintEvent *event);

    void mapPositionY();//滚动坐标计算 从上到下滚动
    void  mapPositionY_BottomToTop();

    void mapPositionX_LeftToRight();//滚动坐标计算 从左到右滚动
    void mapPositionX_RightToLeft();//滚动坐标计算 从右到左滚动
    void updatePosition();

    QTimer main_Timer; //定时器
   //场景地图图片对象
    QPixmap m_map1;
    QPixmap m_map2;

   //场景地图X轴坐标
   int m_map1_posX;
   int m_map2_posX;


   //地图滚动幅度
   int m_scroll_speed;

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

cpp文件

widget.cpp

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

#include <QPainter>

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

    //初始化窗口大小
    setFixedSize(SCENE_WIDTH,SCENE_HEIGHT);

    //初始化加载场景地图对象
    m_map1.load(MAP_PATH);
    m_map2.load(MAP_PATH2);

    //右到左
    //设置场景地图X轴坐标
    m_map1_posX = -SCENE_WIDTH;
    m_map2_posX = 0;

    //设置地图滚动速度
    m_scroll_speed = MAP_SCROLL_SPEED;

    //定时器设置
    main_Timer.setInterval(SCENE_RATE);

    //监听定时器
    connect(&main_Timer,&QTimer::timeout,[=](){
        //更新场景中元素的坐标
        updatePosition();
        //重新绘制图片
        update();
    });

    //启动定时器
    main_Timer.start();

}

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

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    //绘制 从右向左滚动图片 像向后倒
     painter.drawPixmap( m_map1_posX ,0, m_map1);
     painter.drawPixmap( m_map2_posX ,0,  m_map2);
}

//从右到左滚动 向后倒
void Widget::mapPositionX_RightToLeft()
{
    //处理第一张图片滚动
    m_map1_posX -= MAP_SCROLL_SPEED;
    if(m_map1_posX<= -SCENE_WIDTH)
    {
        m_map1_posX =0;
    }
    //处理第二张图片滚动
    m_map2_posX -= MAP_SCROLL_SPEED;
    if(m_map2_posX <= 0 )
    {
        m_map2_posX =SCENE_WIDTH;
    }
}


void Widget::updatePosition()
{
    //更新场景地图坐标
    mapPositionX_RightToLeft();

}

实践效果

QT实现小游戏场景滚动实践_#include_02

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6