欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

QT小游戏——飞机大战

程序员文章站 2022-06-28 15:32:10
话不多说,先来看看效果游戏素材https://download.csdn.net/download/liang13654/12609460上面这个链接包括了多个飞机的图片素材、多种子弹的图片素材、爆炸效果的图片素材以及背景音乐的素材源代码我方飞机出场部分源代码:{ //初始化加载飞机图片资源 m_plane.load(HERO_PATH); //初始化飞机坐标 m_X=(GAME_WIDTH-m_plane.width())*0.5; m_Y=GAME_...

话不多说,先来看看效果
QT小游戏——飞机大战
游戏素材
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