cocos2dx 3.0 對戰的尋路AI
多角色對戰中的尋路是一個比較複雜的問題,筆者嘗試用一個簡單的例子進行說明.
(1)首先我們設定了兩個物件,並且我們讓target 按一個固定軌跡移動,然後讓我們想出一個辦法,使得player能夠自己找到並跟隨target。
_target=Sprite::create("hero1.jpg");
_target->setScale(0.1);
_target->setPosition(visibleSize.width-100,100);
addChild(_target);
_player=Sprite::create("warrior.jpg");
_player
_player->setPosition(visibleSize.width/2,visibleSize.height-100);
addChild(_player);
auto move=MoveTo::create(10,Point(100,100));
_target->runAction(move);
(2)設定player的跟蹤動作和頻率:
this->schedule(schedule_selector(HelloWorld::myUpdate),0.5);
void HelloWorld::myUpdate(float
(3)具體編寫跟蹤動作,記住是在myUpdate內;
auto self=_player->getPosition();
auto target=_target->getPosition();
float distance=sqrt(powf(target.y-self.y,2)+powf(target.x-self.x,2));
float distanceX=target.x-self.x;
float distanceY=target.y-self.y;
我們實時計算除了目標和角色之間的距離、XY的座標差;Point
float vec=60;
設定每幀移動到的點 mid,設定移動的速度每幀60畫素;mid.x=(vec/distance)*distanceX+self.x;
mid.y=(vec/distance)*distanceY+self.y;
用簡單的三角函式,可以計算出mid點的座標;
auto RecT=CCRectMake(_target->getPosition().x-_target->getContentSize().width*0.1/2,_target->getPosition().y-_target->getContentSize().height*0.1/2,_target->getContentSize().width*0.1,_target->getContentSize().height*0.1);
auto RecS=CCRectMake(_player->getPosition().x-_player->getContentSize().width*0.1/2,_player->getPosition().y-_player->getContentSize().height*0.1/2,_player->getContentSize().width*0.1,_player->getContentSize().height*0.1);
if(RecS.intersectsRect(RecT)){
_player->stopAllActions();
}else{
auto move=MoveTo::create(dt, mid);
_player->runAction(move);
}
設定一個碰撞檢測,當角色遇到目標後,會先停下來,否則就一直追趕。好了,結束啦
這裡很簡單,關鍵記住mid的座標計算方法就可以啦
github專案地址:https://github.com/frank1982/route-AI