热门IT资讯网

cocos2d-x 2x 菜鸟编塔防 03 让炮台对准敌人

发表于:2024-11-25 作者:热门IT资讯网编辑
编辑最后更新 2024年11月25日,前面2篇已经简单的实现了几个功能,下面我们要让炮台对准出现的敌人,这样才能对敌人发射×××。这篇主要的就是让炮台跟随敌人旋转角度,网上这类的也很多,但大部分都是C# 和object c的,cocos2

前面2篇已经简单的实现了几个功能,下面我们要让炮台对准出现的敌人,这样才能对敌人发射×××。

这篇主要的就是让炮台跟随敌人旋转角度,网上这类的也很多,但大部分都是C# 和object c的,cocos2d-x 的例子里面有一个这个方面的好像是ClickAndMoveTest

原来很简单,就是遍历所有敌人,通过计算敌人和炮台的两点距离判断是否进入射程,如果进入射程就计算炮台旋转角度,启动旋转动画,用一个回调来发射×××。

直接上代码吧:

town头文件

  1. #ifndef __MC_TOWN_H__
  2. #define __MC_TOWN_H__
  3. #include "cocos2d.h"
  4. #include "HWorld.h"
  5. #include "mC_Creep.h"
  6. using namespace cocos2d;
  7. class mC_Town : public cocos2d::CCNode
  8. {
  9. public:
  10. mC_Town();
  11. ~mC_Town();
  12. public://共有变量
  13. public://共有函数
  14. CREATE_FUNC(mC_Town);
  15. //初始化
  16. bool init();
  17. //逻辑,this->schedule(gameLogic, 1.0f);
  18. void gameLogic(float dt);
  19. //炮台旋转的回调函数
  20. void rotateActionCallBack();
  21. private://私有变量
  22. //炮台图片
  23. CCSprite * _town;
  24. //炮台的位置
  25. const CCPoint * _townpoint;
  26. //炮台的***速度
  27. int _firespeed;
  28. //炮台的***范围,圆形的半径
  29. float _firerange ;
  30. //是否在移动
  31. bool _rotating;
  32. ////目标在数组中的编号
  33. //int _targetnum;
  34. private://私有函数
  35. };
  36. #endif

town cpp文件

  1. #include "mC_Town.h"
  2. mC_Town::~mC_Town()
  3. {
  4. }
  5. mC_Town::mC_Town()
  6. {
  7. }
  8. void mC_Town::gameLogic( float dt )
  9. {
  10. do
  11. {
  12. //-----------------1.判断是否有目标----------------------------
  13. //如果炮台正在移动则跳出
  14. if(_rotating) break;
  15. //遍历所有creep
  16. CCObject * object;
  17. //查找进入射程的creep
  18. CCARRAY_FOREACH(sHWorld->_creepGroup,object)
  19. {
  20. mC_Creep * t_creep= (mC_Creep*)object;
  21. //用炮台的位置和敌人的位置计算出距离,如果距离小于炮台射程就发射×××
  22. float t_range = ccpDistance(
  23. this->getPosition(),
  24. t_creep->getCreepSprite()->getPosition()
  25. );
  26. //如果进入射程就旋转炮台,发射×××
  27. if (_firerange>t_range)
  28. {
  29. //旋转town
  30. float o = t_creep->getCreepSprite()->getPosition().x - this->getPosition().x;
  31. float a = t_creep->getCreepSprite()->getPosition().y - this->getPosition().y;
  32. float at = (float) CC_RADIANS_TO_DEGREES( atanf( o/a) );
  33. if( a < 0 )
  34. {
  35. if( o < 0 )
  36. at = 180 + fabs(at);
  37. else
  38. at = 180 - fabs(at);
  39. }
  40. //开始旋转动作
  41. CCFiniteTimeAction * seq = CCSequence::create(
  42. CCRotateTo::create(0.5f,at),
  43. //回调,用于将炮台设置成不再移动_rotating = false ,并发射×××
  44. CCCallFunc::create(this,callfunc_selector(mC_Town::rotateActionCallBack)),
  45. NULL
  46. );
  47. _town->runAction(seq);
  48. //设置成正在移动炮台
  49. _rotating = true;
  50. //CCLOG("rangge is : %f",t_range);
  51. break;
  52. }
  53. }
  54. } while (0);
  55. }
  56. bool mC_Town::init()
  57. {
  58. //初始化
  59. _firerange = 300;
  60. //初始化是否正在移动
  61. _rotating = false;
  62. //创建一个town,用于测试
  63. _town=CCSprite::create("CloseNormal.png");
  64. this->addChild(_town);
  65. //启动永动游戏逻辑
  66. this->schedule(schedule_selector(mC_Town::gameLogic));
  67. return true;
  68. }
  69. void mC_Town::rotateActionCallBack()
  70. {
  71. _rotating = false;
  72. //开火
  73. }
0