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