QT案例:飞机大战(七)

11 爆炸效果

爆炸效果功能实现步骤如下:

  • 创建爆炸文件和类
  • 添加爆炸类中的成员函数和成员属性
  • 实现成员函数
  • 调用并测试效果

11.1 创建爆炸文件和类

创建Bomb类以及生成对应的文件

创建好后生成bomb.h 和 bomb.cpp两个文件在这里插入图片描述

11.2 爆炸成员函数和成员属性

在config.h中加入爆炸配置数据

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

在bomb.h中添加如下代码:

#ifndef BOMB_H
#define BOMB_H
#include "config.h"
#include <QPixmap>
#include <QVector>

class Bomb
{
public:
    Bomb();

    //更新信息(播放图片下标、播放间隔)
    void updateInfo();

public:

    //放爆炸资源数组
    QVector<QPixmap> m_pixArr;

    //爆炸位置
    int m_X;
    int m_Y;

    //爆炸状态
    bool m_Free;

    //爆炸切图的时间间隔
    int m_Recoder;

    //爆炸时加载的图片下标
    int m_index;
};

#endif // BOMB_H

11.3 实现成员函数

Bomb::Bomb()
{
    //初始化爆炸图片数组
    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 Bomb::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;
    }
}

11.4 加入爆炸数组

在MainScene.h中加入爆炸数组 成员属性

//爆炸数组
    Bomb m_bombs[BOMB_NUM];

在碰撞检测成员函数中,当发生碰撞时,设置爆炸对象的信息

                //播放爆炸效果
                for(int k = 0 ; k < BOMB_NUM;k++)
                {
                    if(m_bombs[k].m_Free)
                    {
                        //爆炸状态设置为非空闲
                        m_bombs[k].m_Free = false;
                        //更新坐标

                        m_bombs[k].m_X = m_enemys[i].m_X;
                        m_bombs[k].m_Y = m_enemys[i].m_Y;
                        break;
                    }
                }

在 MainScene.cpp的updatePosition中追加代码

 //计算爆炸播放的图片
    for(int i = 0 ; i < BOMB_NUM;i++)
    {
        if(m_bombs[i].m_Free == false)
        {
           m_bombs[i].updateInfo();
        }
    }

在 MainScene.cpp的paintEvent 中追加绘制爆炸代码

  //绘制爆炸图片
    for(int i = 0 ; i < BOMB_NUM;i++)
    {
        if(m_bombs[i].m_Free == false)
        {
           painter.drawPixmap(m_bombs[i].m_X,m_bombs[i].m_Y,m_bombs[i].m_pixArr[m_bombs[i].m_index]);
        }
    }

测试,实现爆炸效果
在这里插入图片描述

12 音效添加

音效添加步骤如下:

  • 添加多媒体模块
  • 播放音效

12.1 添加多媒体模块

在工程文件planeWar.pro 中修改代码

QT  += core gui multimedia

在这里插入图片描述

12.2 播放音效

在config.h中 添加音效的配置路径

#define SOUND_BACKGROUND ":/res/bg.wav"
#define SOUND_BOMB ":/res/bomb.wav"

注: QSound使用时候要包含头文件 #include <QSound>

在PlayGame中添加背景音乐

    //启动背景音乐
    QSound::play(SOUND_BACKGROUND);

在爆炸时候添加爆炸音效

//播放音效
	QSound::play(SOUND_BOMB);

测试音效

13 打包发布

  1. 确定环境变量配置好 PATH: C:\Qt\Qt5.x.x\5.x.x\mingw53_32\bin

  2. 在QT中把运行模式切换成 release 模式, 编译。 在外层目录中会有 release 版本的目录.

  3. 将目录中的 rcc 二进制资源文件、可执行程序文件(.exe) 拷贝到另外一个单独的文件夹中.

  4. 进入 cmd 命令模式,切换到可执行程序所在的目录. 执行以下命令,将可执行程序所需的库文件拷贝到当前目录:

    windeployqt PlaneWar.exe
    
  5. 额外可以将 ico 图标也拷贝到当前可执行程序所在的目录.

  6. 启动 HM NIS EDIT 软件,在软件中选择: 文件->新建脚本向导, 接下来跟着向导操作.

  7. 为了让安装包安装软件也有快捷方式图标,在生成的脚本里。进行修改:

    CreateShortCut "$DESKTOP\飞机大战.lnk" "$INSTDIR\PlaneWar.exe"
    CreateShortCut "$DESKTOP\飞机大战.lnk" "$INSTDIR\PlaneWar.exe" "" "$INSTDIR\app.ico"
    
  8. 点击菜单栏的 NSIS ,然后选择编译,在桌面生成安装包.

至此本案例实现完毕!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值