五.飞机大战( 七 )


在.cpp中实现成员函数,代码如下:

  1. EnemyPlane::EnemyPlane()
  2. {
  3. //敌机资源加载
  4. m_enemy.load(ENEMY_PATH);
  5. //敌机位置
  6. m_X = 0;
  7. m_Y = 0;
  8. //敌机状态
  9. m_Free = true;
  10. //敌机速度
  11. m_Speed = ENEMY_SPEED;
  12. //敌机矩形
  13. m_Rect.setWidth(m_enemy.width());
  14. m_Rect.setHeight(m_enemy.height());
  15. m_Rect.moveTo(m_X,m_Y);
  16. }
  17. void EnemyPlane::updatePosition()
  18. {
  19. //空闲状态,不计算坐标
  20. if(m_Free)
  21. {
  22. return;
  23. }
  24. m_Y += m_Speed;
  25. m_Rect.moveTo(m_X,m_Y);
  26. if(m_Y >= GAME_HEIGHT + m_Rect.height())
  27. {
  28. m_Free = true;
  29. }
  30. }

9.4 敌机出场
在.h中追加敌机出场的成员函数
在.h中追加敌机数组 和 敌机出场间隔记录 的成员属性
  1. //敌机出场
  2. void enemyToScene();
  3. //敌机数组
  4. EnemyPlane m_enemys[ENEMY_NUM];
  5. //敌机出场间隔记录
  6. int m_recorder;

初始化间隔记录属性,在.cpp的成员函数中追加
m_recorder = 0;
实现成员函数
  1. void MainScene::enemyToScene()
  2. {
  3. m_recorder++;
  4. if(m_recorder < ENEMY_INTERVAL)
  5. {
  6. return;
  7. }
  8. m_recorder = 0;
  9. for(int i = 0 ; i< ENEMY_NUM;i++)
  10. {
  11. if(m_enemys[i].m_Free)
  12. {
  13. //敌机空闲状态改为false
  14. m_enemys[i].m_Free = false;
  15. //设置坐标
  16. m_enemys[i].m_X = rand() % (GAME_WIDTH - m_enemys[i].m_Rect.width());
  17. m_enemys[i].m_Y = -m_enemys[i].m_Rect.height();
  18. break;
  19. }
  20. }
  21. }

在成员函数的信号发送时候,槽函数中首先追加
  1. //敌机出场
  2. enemyToScene();

五.飞机大战

文章插图
更新敌机坐标,在成员函数中追加代码
  1. //敌机坐标计算
  2. for(int i = 0 ; i< ENEMY_NUM;i++)
  3. {
  4. //非空闲敌机 更新坐标
  5. if(m_enemys[i].m_Free == false)
  6. {
  7. m_enemys[i].updatePosition();
  8. }
  9. }

绘制敌机,在成员函数中追加绘制敌机代码
  1. //绘制敌机
  2. for(int i = 0 ; i< ENEMY_NUM;i++)
  3. {
  4. if(m_enemys[i].m_Free == false)
  5. {
  6. painter.drawPixmap(m_enemys[i].m_X,m_enemys[i].m_Y,m_enemys[i].m_enemy);
  7. }
  8. }

添加随机数种子
在.cpp中成员函数里添加随机数种子
  1. //随机数种子
  2. srand((unsigned int)time(NULL));//头文件#include

运行测试敌机出场效果
五.飞机大战

文章插图
10 碰撞检测
实现碰撞检测步骤如下:
10.1 添加并实现碰撞检测函数
在.h中添加新的成员函数
void collisionDetection();
在.cpp中实现该成员函数