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

来源:互联网 发布:软件界面设计工具 编辑:程序博客网 时间:2024/04/28 02:45

前面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.       
  13. public://共有变量  
  14.  
  15. public://共有函数  
  16.     CREATE_FUNC(mC_Town);  
  17.     //初始化  
  18.     bool init();  
  19.     //逻辑,this->schedule(gameLogic, 1.0f);   
  20.     void gameLogic(float dt);  
  21.     //炮台旋转的回调函数  
  22.     void rotateActionCallBack();  
  23. private://私有变量  
  24.     //炮台图片  
  25.     CCSprite  * _town;  
  26.     //炮台的位置  
  27.     const   CCPoint * _townpoint;  
  28.     //炮台的攻击速度  
  29.     int _firespeed;  
  30.     //炮台的攻击范围,圆形的半径  
  31.     float _firerange ;  
  32.     //是否在移动  
  33.     bool _rotating;  
  34.     ////目标在数组中的编号  
  35.     //int _targetnum;  
  36.  
  37. private://私有函数  
  38.  
  39. };  
  40. #endif 

town cpp文件

 

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

 

本文出自 “远在南非” 博客,请务必保留此出处http://farsa.blog.51cto.com/6172595/1138602