1. 程式人生 > >cocos2dx 3.0 對戰的尋路AI

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

->setScale(0.1);

    _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

dt){}

(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

mid;

    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