温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-04-06 23:25:07 阅读:1273 作者:83628410 栏目:游戏开发
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

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

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

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

直接上代码吧:

town头文件

#ifndef __MC_TOWN_H__         #define __MC_TOWN_H__  #include "cocos2d.h"  #include "HWorld.h"  #include "mC_Creep.h"  using namespace cocos2d;  class mC_Town : public cocos2d::CCNode  {  public:      mC_Town();      ~mC_Town();        public://共有变量   public://共有函数      CREATE_FUNC(mC_Town);      //初始化      bool init();      //逻辑,this->schedule(gameLogic, 1.0f);       void gameLogic(float dt);      //炮台旋转的回调函数      void rotateActionCallBack();  private://私有变量      //炮台图片      CCSprite  * _town;      //炮台的位置      const   CCPoint * _townpoint;      //炮台的***速度      int _firespeed;      //炮台的***范围,圆形的半径      float _firerange ;      //是否在移动      bool _rotating;      ////目标在数组中的编号      //int _targetnum;   private://私有函数   };  #endif 

town cpp文件

#include "mC_Town.h"     mC_Town::~mC_Town()  {   }   mC_Town::mC_Town()  {   }   void mC_Town::gameLogic( float dt )  {       do       {          //-----------------1.判断是否有目标----------------------------          //如果炮台正在移动则跳出          if(_rotating) break;               //遍历所有creep              CCObject * object;              //查找进入射程的creep              CCARRAY_FOREACH(sHWorld->_creepGroup,object)              {                  mC_Creep * t_creep= (mC_Creep*)object;                  //用炮台的位置和敌人的位置计算出距离,如果距离小于炮台射程就发射×××                  float t_range = ccpDistance(                      this->getPosition(),                      t_creep->getCreepSprite()->getPosition()                      );                  //如果进入射程就旋转炮台,发射×××                  if (_firerange>t_range)                  {                      //旋转town                       float o = t_creep->getCreepSprite()->getPosition().x - this->getPosition().x;                      float a = t_creep->getCreepSprite()->getPosition().y - this->getPosition().y;                      float at = (float) CC_RADIANS_TO_DEGREES( atanf( o/a) );                      if( a < 0 )                       {                          if(  o < 0 )                              at = 180 + fabs(at);                          else                             at = 180 - fabs(at);                          }                      //开始旋转动作                      CCFiniteTimeAction * seq = CCSequence::create(                          CCRotateTo::create(0.5f,at),                          //回调,用于将炮台设置成不再移动_rotating = false ,并发射×××                          CCCallFunc::create(this,callfunc_selector(mC_Town::rotateActionCallBack)),                          NULL                                                                  );                       _town->runAction(seq);                      //设置成正在移动炮台                      _rotating = true;                      //CCLOG("rangge is : %f",t_range);                      break;                  }          }                 } while (0);   }  bool mC_Town::init()  {      //初始化      _firerange = 300;      //初始化是否正在移动      _rotating = false;      //创建一个town,用于测试      _town=CCSprite::create("CloseNormal.png");      this->addChild(_town);      //启动永动游戏逻辑      this->schedule(schedule_selector(mC_Town::gameLogic));      return true;   }   void mC_Town::rotateActionCallBack()  {      _rotating = false;      //开火  }    

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×