五.飞机大战( 八 )

  1. void MainScene::collisionDetection()
  2. {
  3. //遍历所有非空闲的敌机
  4. for(int i = 0 ;i < ENEMY_NUM;i++)
  5. {
  6. if(m_enemys[i].m_Free)
  7. {
  8. //空闲飞机 跳转下一次循环
  9. continue;
  10. }
  11. //遍历所有 非空闲的子弹
  12. for(int j = 0 ; j < BULLET_NUM;j++)
  13. {
  14. if(m_hero.m_bullets[j].m_Free)
  15. {
  16. //空闲子弹 跳转下一次循环
  17. continue;
  18. }
  19. //如果子弹矩形框和敌机矩形框相交,发生碰撞,同时变为空闲状态即可
  20. if(m_enemys[i].m_Rect.intersects(m_hero.m_bullets[j].m_Rect))
  21. {
  22. m_enemys[i].m_Free = true;
  23. m_hero.m_bullets[j].m_Free = true;
  24. }
  25. }
  26. }
  27. }

10.2 调用并测试函数
在.cpp中 成员函数里,追加碰撞检测代码
五.飞机大战

文章插图
运行查看效果,子弹和敌机碰撞后会同时消失
11 爆炸效果
爆炸效果功能实现步骤如下:
11.1 创建爆炸文件和类
创建Bomb类以及生成对应的文件
创建好后生成bomb.h 和 bomb.cpp两个文件
五.飞机大战

文章插图
11.2 爆炸成员函数和成员属性
在.h中加入爆炸配置数据
  1. #define BOMB_PATH":/res/bomb-%1.png"//爆炸资源图片
  2. #define BOMB_NUM20//爆炸数量
  3. #define BOMB_MAX7//爆炸图片最大索引
  4. #define BOMB_INTERVAL 20//爆炸切图时间间隔

在bomb.h中添加如下代码:
  1. #ifndef BOMB_H
  2. #define BOMB_H
  3. #include "config.h"
  4. #include
  5. #include
  6. class Bomb
  7. {
  8. public:
  9. Bomb();
  10. //更新信息(播放图片下标、播放间隔)
  11. void updateInfo();
  12. public:
  13. //放爆炸资源数组
  14. QVector m_pixArr;
  15. //爆炸位置
  16. int m_X;
  17. int m_Y;
  18. //爆炸状态
  19. bool m_Free;
  20. //爆炸切图的时间间隔
  21. int m_Recoder;
  22. //爆炸时加载的图片下标
  23. int m_index;
  24. };
  25. #endif // BOMB_H

11.3 实现成员函数
  1. Bomb::Bomb()
  2. {
  3. //初始化爆炸图片数组
  4. for(int i = 1 ;i <= BOMB_MAX ;i++)
  5. {
  6. //字符串拼接,类似":/res/bomb-1.png"
  7. QString str = QString(BOMB_PATH).arg(i);
  8. m_pixArr.push_back(QPixmap(str));
  9. }
  10. //初始化坐标
  11. m_X = 0;
  12. m_Y = 0;
  13. //初始化空闲状态
  14. m_Free = true;
  15. //当前播放图片下标
  16. m_index = 0;
  17. //爆炸间隔记录
  18. m_Recoder = 0;
  19. }
  20. void Bomb::updateInfo()
  21. {
  22. //空闲状态
  23. if(m_Free)
  24. {
  25. return;
  26. }
  27. m_Recoder++;
  28. if(m_Recoder < BOMB_INTERVAL)
  29. {
  30. //记录爆炸间隔未到,直接return,不需要切图
  31. return;
  32. }
  33. //重置记录
  34. m_Recoder = 0;
  35. //切换爆炸播放图片
  36. m_index++;
  37. //注:数组中的下标从0开始,最大是6
  38. //如果计算的下标大于6,重置为0
  39. if(m_index > BOMB_MAX-1)
  40. {
  41. m_index = 0;
  42. m_Free = true;
  43. }
  44. }

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