话不多说,先来看看效果

游戏素材
https://download.csdn.net/download/liang13654/12609460
上面这个链接包括了多个飞机的图片素材、多种子弹的图片素材、爆炸效果的图片素材以及背景音乐的素材
源代码
我方飞机出场部分源代码:

{
    //初始化加载飞机图片资源
    m_plane.load(HERO_PATH);
    //初始化飞机坐标
    m_X=(GAME_WIDTH-m_plane.width())*0.5;
    m_Y=GAME_HEIGHT-m_plane.height();
    //初始化矩形边框
    m_Rect.setWidth(m_plane.width());
    m_Rect.setHeight(m_plane.height());
    m_Rect.moveTo(m_X,m_Y);
}

敌方飞机:

Enemyplane::Enemyplane()
{
    //敌机资源加载
    m_enemy.load(ENEMY_PATH);
    //敌机位置
    m_X = 0;
    m_Y = 0;
    //敌机状态
    m_Free = true;
    //敌机速度
    m_Speed = ENEMY_SPEED;
    //敌机矩形框(碰撞检测)
    m_Rect.setWidth(m_enemy.width());
    m_Rect.setHeight(m_enemy.height());
    m_Rect.moveTo(m_X,m_Y);
}

void Enemyplane::updatePosition()
{
    //空闲状态,不计算坐标
    if(m_Free)
    {
        return;
    }
    m_Y += m_Speed;
    m_Rect.moveTo(m_X,m_Y);
    //如果超出屏幕 重置空闲状态
    if(m_Y >= GAME_HEIGHT+m_Rect.height())
    {
        m_Free = true;
    }
}

子弹:

Bullet::Bullet()
{
    //加载子弹资源
    m_Bullet.load(BULLET_PATH);
    //子弹坐标
    m_X=GAME_WIDTH*0.5-m_Bullet.width()*0.5;
    m_Y=GAME_HEIGHT;
    //子弹状态 默认空闲
    m_Free=true;
    //子弹移动速度
    m_Speed=BULLET_SPEED;
    //子弹边框
    m_Rect.setWidth(m_Bullet.width());
    m_Rect.setHeight(m_Bullet.height());
    m_Rect.moveTo(m_X,m_Y);
}

void Bullet::updatePosition()
{
    //空闲状态下的子弹不需要计算坐标
    if(m_Free)
    {
        return;
    }
    //子弹向上移动
    m_Y-=m_Speed;
    m_Rect.moveTo(m_X,m_Y);
    //子弹位置 超出屏幕 重新变为空闲状态
    if(m_Y<=-m_Rect.height())
    {
        m_Free=true;
    }
}

爆炸效果:

Bao::Bao()
{
    //初始化爆炸图片数组
    for(int i = 1 ;i <= BOMB_MAX ;i++)
    {
        //字符串拼接,类似 ":/res/bomb-1.png"
        QString str = QString(BOMB_PATH).arg(i);
        m_pixArr.push_back(QPixmap(str));
    }
    //初始化坐标
    m_X = 0;
    m_Y = 0;
    //初始化空闲状态
    m_Free = true;
    //当前播放图片下标
    m_index = 0;
    //爆炸间隔记录
    m_Recoder = 0;
}

void Bao::updateInfo()
{
    //空闲状态
    if(m_Free)
    {
        return;
    }
    m_Recoder++;
    if(m_Recoder < BOMB_INTERVAL)
    {
        //记录爆炸间隔未到,直接return,不需要切图
        return;
    }
    //重置记录
    m_Recoder = 0;
    //切换爆炸播放图片
    m_index++;
    //注:数组中的下标从0开始,最大是6
    //如果计算的下标大于6,重置为0
    if(m_index > BOMB_MAX-1)
    {
        m_index = 0;
        m_Free = true;
    }
}

配置数据:

/**********************游戏配置数据************************/
//窗口大小、名字
#define GAME_WIDTH 512//宽度
#define GAME_HEIGHT 768//高度
#define GAME_TITLE "飞机大战1.0"//标题
#define GAME_RES_PATH "./plane.rcc" //rcc文件路径
#define GAME_ICON ":/res/app.ico" //图标加载路径
#define GAME_RATM 10 //定时器刷新时间间隔 单位毫秒

/**********************地图配置数据************************/
#define MAP_PATH ":/res/img_bg_level_1.jpg" //地图路径
#define MAP_SCROLL_SPEED 2 //地图滚动速度

/**********************飞机配置数据************************/
#define HERO_PATH ":/res/hero2.png"

/**********************子弹配置数据************************/
#define BULLET_PATH ":/res/bullet_11.png" //子弹图片路径
#define BULLET_SPEED 5 //子弹移动速度
#define BULLET_NUM 30//子弹的总数
#define BULLET_INTERVAL 10//子弹的发射间隔

/**********************敌机配置数据************************/
#define ENEMY_PATH ":/res/img-plane_5.png" //敌机资源图片
#define ENEMY_SPEED 5 //敌机移动速度
#define ENEMY_NUM 20 //敌机总数量
#define ENEMY_INTERVAL 30 //敌机出场时间间隔

/**********************爆炸配置数据************************/
#define BOMB_PATH ":/res/bomb-%1.png" //爆炸资源图片
#define BOMB_NUM 20 //爆炸数量
#define BOMB_MAX 7 //爆炸图片最大索引
#define BOMB_INTERVAL 20 //爆炸切图时间间隔

/**********************音效配置数据************************/
#define SOUND_BACKGROUND ":/res/bg.wav"
#define SOUND_BOMB ":/res/bomb.wav"

至于具体应该如何实现这个游戏,请到这个链接:https://download.csdn.net/download/liang13654/12610632

本文地址:https://blog.csdn.net/liang13654/article/details/107344561