QT实现小游戏场景滚动实践
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
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();
}
实践效果
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |