Qt实现背景滚动
一、创建背景文件和类
选择C++ -> C++ Class
修改类名为map,点击下一步,直到创建完毕
二、背景的成员函数和成员属性
在map.h中添加如下代码
#ifndef MAP_H
#define MAP_H
#include <QPixmap>class Map
{
public://构造函数Map();//地图滚动坐标计算void mapPosition();public://地图图片对象 QPixmap负责处理图QPixmap m_map1;QPixmap m_map2;//地图Y轴坐标int m_map1_posY;int m_map2_posY;//地图滚动幅度int m_scroll_speed;
};#endif // MAP_H
三、实现成员函数
在config.h中添加新的配置数据
/********** 地图配置数据 **********/
#define MAP_PATH ":/res/img_bg_level_1.jpg" //地图图片路径
#define MAP_SCROLL_SPEED 2 //地图滚动速度
在map.cpp中实现成员函数
#include "map.h"
#include "config.h"Map::Map()
{//初始化加载地图对象m_map1.load(MAP_PATH); m_map2.load(MAP_PATH);//设置坐标m_map1_posY = -GAME_HEIGHT; //图一从图片的底部在窗口的顶部向下滑m_map2_posY = 0; //图二从图片的顶部在窗口的顶部向下滑//设置滚动速度m_scroll_speed = MAP_SCROLL_SPEED;}void Map::mapPosition()
{//处理第一张图片滚动m_map1_posY += m_scroll_speed;if(m_map1_posY >= 0){m_map1_posY = -GAME_HEIGHT;}//处理第二张图片滚动m_map2_posY += m_scroll_speed;if(m_map2_posY >= GAME_HEIGHT){m_map2_posY = 0;}}
四、启用定时器
在 m ain S c e n e.h 中 添 加 新 的 定 时 器 对 象
//定时器对象QTimer m_Timer;
在 c o n fi g.h 中 添 加 屏 幕 刷 新 间 隔
#define GAME_RATE 10 //单位毫秒
在 M ain S c e n e.c p p 的init S c e n e 中 追 加 代 码
//设置定时器间隔m_Timer.setInterval(GAME_RATE);
五、启动定时器实现背景滚动
在MainScene.h中添加新的成员函数以及成员对象
//启动游戏 用于启动定时器对象void playGame();//更新坐标void updatePosition();//绘图事件void paintEvent(QPaintEvent *event);//地图对象Map m_map;
在MainScene.cpp中实现成员函数
void MainScence::playGame()
{//玩游戏 启动定时器m_Timer.start();//监听定时器的信号connect(&m_Timer , &QTimer::timeout,[=](){//更新游戏中所有元素的坐标updatePosition();//游戏中的元素 绘制到屏幕中update(); //再调用paintEvent函数});}void MainScence::updatePosition()
{//更新地图坐标m_map.mapPosition();}//该函数是虚函数,当update()函数被调用时会强制执行
void MainScence::paintEvent(QPaintEvent *event)
{//利用画家画图图片QPainter painter(this);//绘制地图painter.drawPixmap(0,m_map.m_map1_posY,m_map.m_map1);painter.drawPixmap(0,m_map.m_map2_posY,m_map.m_map2);}