五.飞机大战( 六 )


8.2 成员函数补充

五.飞机大战

文章插图
在构造函数中初始化发生间隔记录
  1. //初始化发射间隔记录
  2. m_recorder = 0;

之前在英雄飞机类中预留的一个shoot函数我们进行实现,代码如下:
  1. void HeroPlane::shoot()
  2. {
  3. //累加时间间隔记录变量
  4. m_recorder++;
  5. //判断如果记录数字 未达到发射间隔,直接return
  6. if(m_recorder < BULLET_INTERVAL)
  7. {
  8. return;
  9. }
  10. //到达发射时间处理
  11. //重置发射时间间隔记录
  12. m_recorder = 0;
  13. //发射子弹
  14. for(int i = 0 ; i < BULLET_NUM;i++)
  15. {
  16. //如果是空闲的子弹进行发射
  17. if(m_bullets[i].m_Free)
  18. {
  19. //将改子弹空闲状态改为假
  20. m_bullets[i].m_Free = false;
  21. //设置发射的子弹坐标
  22. m_bullets[i].m_X = m_X + m_Rect.width()*0.5 - 10;
  23. m_bullets[i].m_Y = m_Y - 25 ;
  24. break;
  25. }
  26. }
  27. }

8.3 主场景中实现发射子弹
在.cpp的成员函数中追加如下代码
  1. //发射子弹
  2. m_hero.shoot();
  3. //计算子弹坐标
  4. for(int i = 0 ;i < BULLET_NUM;i++)
  5. {
  6. //如果子弹状态为非空闲,计算发射位置
  7. if(!m_hero.m_bullets[i].m_Free)
  8. {
  9. m_hero.m_bullets[i].updatePosition();
  10. }
  11. }

在.cpp的成员函数中追加如下代码:
  1. //绘制子弹
  2. for(int i = 0 ;i < BULLET_NUM;i++)
  3. {
  4. //如果子弹状态为非空闲,计算发射位置
  5. if(!m_hero.m_bullets[i].m_Free)
  6. {
  7. painter.drawPixmap(m_hero.m_bullets[i].m_X,m_hero.m_bullets[i].m_Y,m_hero.m_bullets[i].m_Bullet);
  8. }
  9. }

测试运行,玩家可以发射子弹
五.飞机大战

文章插图
9 敌机制作
敌机制作与子弹制作原理类似,也是每隔一定的时间让敌机出场
制作步骤如下:
9.1 创建敌机文件和类
创建类以及生成对应的文件
创建好后生成.h 和 .cpp两个文件
五.飞机大战

文章插图
9.2 敌机成员函数和成员属性
在.h中添加如下代码:
  1. #ifndef ENEMYPLANE_H
  2. #define ENEMYPLANE_H
  3. #include
  4. class EnemyPlane
  5. {
  6. public:
  7. EnemyPlane();
  8. //更新坐标
  9. void updatePosition();
  10. public:
  11. //敌机资源对象
  12. QPixmap m_enemy;
  13. //位置
  14. int m_X;
  15. int m_Y;
  16. //敌机的矩形边框(碰撞检测)
  17. QRect m_Rect;
  18. //状态
  19. bool m_Free;
  20. //速度
  21. int m_Speed;
  22. };
  23. #endif // ENEMYPLANE_H

9.3 敌机成员函数实现
在.h中追加敌机配置信息
  1. /**********敌机配置数据 **********/
  2. #define ENEMY_PATH":/res/img-plane_5.png"//敌机资源图片
  3. #define ENEMY_SPEED 5//敌机移动速度
  4. #define ENEMY_NUM20//敌机总数量
  5. #define ENEMY_INTERVAL30//敌机出场时间间隔