五.飞机大战( 五 )


7.2 子弹的成员函数和成员属性
在.h中添加代码

  1. #ifndef BULLET_H
  2. #define BULLET_H
  3. #include "config.h"
  4. #include
  5. class Bullet
  6. {
  7. public:
  8. Bullet();
  9. //更新子弹坐标
  10. void updatePosition();
  11. public:
  12. //子弹资源对象
  13. QPixmap m_Bullet;
  14. //子弹坐标
  15. int m_X;
  16. int m_Y;
  17. //子弹移动速度
  18. int m_Speed;
  19. //子弹是否闲置
  20. bool m_Free;
  21. //子弹的矩形边框(用于碰撞检测)
  22. QRect m_Rect;
  23. };
  24. #endif // BULLET_H

7.3 子弹类成员函数实现
在.h中追加子弹配置信息
  1. /**********子弹配置数据 **********/
  2. #define BULLET_PATH ":/res/bullet_11.png"//子弹图片路径
  3. #define BULLET_SPEED 5//子弹移动速度

在.cpp中实现成员函数,代码如下:
  1. #include "bullet.h"
  2. Bullet::Bullet()
  3. {
  4. //加载子弹资源
  5. m_Bullet.load(BULLET_PATH);
  6. //子弹坐标 初始坐标可随意设置,后期会重置
  7. m_X = GAME_WIDTH*0.5 - m_Bullet.width()*0.5;
  8. m_Y = GAME_HEIGHT;
  9. //子弹状态
  10. m_Free = true;
  11. //子弹速度
  12. m_Speed = BULLET_SPEED;
  13. //子弹矩形框
  14. m_Rect.setWidth(m_Bullet.width());
  15. m_Rect.setHeight(m_Bullet.height());
  16. m_Rect.moveTo(m_X,m_Y);
  17. }
  18. void Bullet::updatePosition()
  19. {
  20. //如果子弹是空闲状态,不需要坐标计算
  21. //玩家飞机可以控制子弹的空闲状态为false
  22. if(m_Free)
  23. {
  24. return;
  25. }
  26. //子弹向上移动
  27. m_Y-= m_Speed;
  28. m_Rect.moveTo(m_X,m_Y);
  29. if(m_Y <= -m_Rect.height())
  30. {
  31. m_Free = true;
  32. }
  33. }

7.4 测试子弹
子弹本身应该由飞机发射,测试阶段我们写一段辅助代码,看看效果即可
测试过后,这些代码可以删除掉
在.h中添加测试代码
  1. //测试子弹代码
  2. Bullet temp_bullet;

在.cpp中的里添加测试代码
  1. //测试子弹代码
  2. temp_bullet.m_Free = false;
  3. temp_bullet.updatePosition();

在.cpp中的里添加测试代码
  1. //测试子弹代码
  2. painter.drawPixmap(temp_bullet.m_X,temp_bullet.m_Y,temp_bullet.m_Bullet);

运行程序,此时会有一发子弹从屏幕中射出
五.飞机大战

文章插图
测试完毕后,测试代码删除或注释即可
8 玩家发射子弹
玩家发射子弹制作步骤如下:
8.1 飞机添加新成员属性
在.h中添加新的配置数据
  1. #define BULLET_NUM 30//弹匣中子弹总数
  2. #define BULLET_INTERVAL 20 //发射子弹时间间隔

在.h中新增成员属性如下:
  1. //弹匣
  2. Bullet m_bullets[BULLET_NUM];
  3. //发射间隔记录
  4. int m_recorder;