cocos2d-x 2x 菜鸟编塔防 03 让炮台对准敌人
前面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" usingnamespacecocos2d; classmC_Town:publiccocos2d::CCNode { public: mC_Town(); ~mC_Town(); public://共有变量 public://共有函数 CREATE_FUNC(mC_Town); //初始化 boolinit(); //逻辑,this->schedule(gameLogic,1.0f); voidgameLogic(floatdt); //炮台旋转的回调函数 voidrotateActionCallBack(); private://私有变量 //炮台图片 CCSprite*_town; //炮台的位置 constCCPoint*_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() { } voidmC_Town::gameLogic(floatdt) { do { //-----------------1.判断是否有目标---------------------------- //如果炮台正在移动则跳出 if(_rotating)break; //遍历所有creep CCObject*object; //查找进入射程的creep CCARRAY_FOREACH(sHWorld->_creepGroup,object) { mC_Creep*t_creep=(mC_Creep*)object; //用炮台的位置和敌人的位置计算出距离,如果距离小于炮台射程就发射××× floatt_range=ccpDistance( this->getPosition(), t_creep->getCreepSprite()->getPosition() ); //如果进入射程就旋转炮台,发射××× if(_firerange>t_range) { //旋转town floato=t_creep->getCreepSprite()->getPosition().x-this->getPosition().x; floata=t_creep->getCreepSprite()->getPosition().y-this->getPosition().y; floatat=(float)CC_RADIANS_TO_DEGREES(atanf(o/a)); if(a<0) { if(o<0) at=180+fabs(at); elseat=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("ranggeis:%f",t_range); break; } } }while(0); } boolmC_Town::init() { //初始化 _firerange=300; //初始化是否正在移动 _rotating=false; //创建一个town,用于测试 _town=CCSprite::create("CloseNormal.png"); this->addChild(_town); //启动永动游戏逻辑 this->schedule(schedule_selector(mC_Town::gameLogic)); returntrue; } voidmC_Town::rotateActionCallBack() { _rotating=false; //开火 }
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。