5 地图滚动
步骤:
- 创建地图文件和类
- 添加成员函数和成员属性
实现成员函数 - 游戏运行调用定时器
- 启动定时器,监听定时器信号实现游戏循环
- 计算游戏内元素坐标
- 绘制到屏幕中
5.1 创建地图文件和类
右键项目,添加新文件
选择C++ -> C++ Class
修改类名为map,点击下一步,直到创建完毕
至此,地图Map的文件和类创建完毕
5.2 地图的成员函数和成员属性
在map.h中添加如下代码
#ifndef MAP_H
#define MAP_H
#include <QPixmap>
class Map
{
public:
//构造函数
Map();
//地图滚动坐标计算
void mapPosition();
public:
//地图图片对象
QPixmap m_map1;
QPixmap m_map2;
//地图Y轴坐标
int m_map1_posY;
int m_map2_posY;
//地图滚动幅度
int m_scroll_speed;
};
#endif // MAP_H
5.3 实现成员函数
在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);
//设置地图其实y轴坐标
m_map1_posY = -GAME_HEIGHT;
m_map2_posY = 0;
//设置地图滚动速度
m_scroll_speed = MAP_SCROLL_SPEED;
}
void Map::mapPosition()
{
//处理第一张图片滚动
m_map1_posY += MAP_SCROLL_SPEED;
if(m_map1_posY >= 0)
{
m_map1_posY =-GAME_HEIGHT;
}
//处理第二张图片滚动
m_map2_posY += MAP_SCROLL_SPEED;
if(m_map2_posY >= GAME_HEIGHT )
{
m_map2_posY =0;
}
}
5.4 定时器添加
在mainScene.h中添加新的定时器对象
QTimer m_Timer;
在 config.h中添加 屏幕刷新间隔
#define GAME_RATE 10 //刷新间隔,帧率 单位毫秒
在MainScene.cpp的initScene中追加代码
//定时器设置
m_Timer.setInterval(GAME_RATE);
5.5 启动定时器实现地图滚动
在MainScene.h中添加新的成员函数以及成员对象
//启动游戏 用于启动定时器对象
void playGame();
//更新坐标
void updatePosition();
//绘图事件
void paintEvent(QPaintEvent *event);
//地图对象
Map m_map;
在MainScene.cpp中实现成员函数
void MainScene::playGame()
{
//启动定时器
m_Timer.start();
//监听定时器
connect(&m_Timer,&QTimer::timeout,[=](){
//更新游戏中元素的坐标
updatePosition();
//重新绘制图片
update();
});
}
void MainScene::updatePosition()
{
//更新地图坐标
m_map.mapPosition();
}
void MainScene::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);
}
测试运行游戏,实现地图滚动