其他章节链接

​QT飞机大战二(飞机类)​

​QT飞机大战三(子弹类)​


QT飞机大战一(游戏场景配置)_#define

如图所示,主场景配置长这个样子

大概思路是:这张图片上下可以缝合

所以可以设置定时器,让这张图片循环滚动

循环滚动,我们可以用两张图片来完成,

使用定时器不断调用 p a i n t E v e n t paintEvent paintEvent来绘制


设置地图类 m a p map map

​map.h​

#ifndef MAP_H
#define MAP_H
#include <QPixmap>

class map
{
public:
map(QString MAP_PATH);//构造函数,传入地图图片的路径
//地图滚动坐标计算
void mapPosition();//更新图片位置的函数

public:
QPixmap map1;//图片一
QPixmap map2;//图片二
//地图Y轴坐标
int map1_posY;//图片一的纵坐标
int map2_posY;//图片二的纵坐标
int m_scroll_speed;//地图滚动幅度
};
#endif // MAP_H

​map.cpp​

#include "map.h"
#include <config.h>
map::map(QString MAP_PATH)
{
map1.load(MAP_PATH);//加载图片
map2.load(MAP_PATH);
map1_posY = -GAME_HEIGHT;//第一张图片的初始位置在屏幕外GAME_HEIGHT
map2_posY = 0;//第二张图片位置刚好在屏幕左上角

//地图滚动
m_scroll_speed = MAP_SCROLL_SPEED;//设置每次滚动多少像素
}

void map::mapPosition()
{
//处理第一张图片滚动位置
map1_posY += m_scroll_speed; //第一张图往下跑
if( map1_posY>=0 ) map1_posY = -GAME_HEIGHT;
map2_posY += m_scroll_speed;//第二张图往下跑
if( map2_posY>=GAME_HEIGHT ) map2_posY = 0;//循环
}

设置主场景 M a i n S c e n e MainScene MainScene

​MainScene.h​

#ifndef MAINSCENE_H
#define MAINSCENE_H

#include <QWidget>
#include <QTimer>
#include <QPainter>
#include <map.h>
namespace Ui {
class MainScene;
}

class MainScene : public QWidget
{
Q_OBJECT

public:
explicit MainScene(QWidget *parent = 0);
~MainScene();
//初始化场景
void initScene();
//启动游戏
void playGame();
//绘制函数
void paintEvent(QPaintEvent *);
//地图对象
map *m_map;
QTimer timer;//让地图滚动的定时器
private:
Ui::MainScene *ui;
};
#endif // MAINSCENE_H

​MainScene.cpp​

#include "mainscene.h"
#include "ui_mainscene.h"
#include <config.h>
#include <QDebug>
#include <QTimer>
#include <QPainter>
MainScene::MainScene(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainScene)
{
ui->setupUi(this);
initScene();//初始化游戏场景
}

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

void MainScene::initScene()
{
setFixedSize(GAME_WIDTH,GAME_HEIGHT); //设置窗口的固定尺寸
setWindowTitle(GAME_TITLE);//设置标题
setWindowIcon(QIcon(":/res/app.ico") );//设置小图标
m_map = new map(":/res/img_bg_level_1.jpg");//new一个map对象
//场景定时器设置
timer.setInterval(10);
playGame();//开始游戏
}

void MainScene::playGame()
{
//监听定时器发送的信号
connect(&timer,&QTimer::timeout,[=](){
m_map->mapPosition(); //更新游戏中元素的坐标
update();//重新绘制地图
});
//启动定时器
timer.start();
}

void MainScene::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(0,m_map->map1_posY,m_map->map1);//绘制图片
painter.drawPixmap(0,m_map->map2_posY,m_map->map2);
}