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