/** * 开始点 */ void AstarFlexible::setStart(int x ,int y) { CC_SAFE_RELEASE(m_start); m_start=new AstarNode(); m_start->init(x,y); addToOpen(m_start); }
void Astar::starSearch(int fid) { auto item = (AstarItem*)_close->getObjectAtIndex(fid); int col = item->getCol(); int row = item->getRow(); // 搜索目前的点的上,下,左,右四个方向 // 下 int mycol = col; int myrow = row - 1; if(myrow >= 0 && checkMap(mycol, myrow)) { if(checkOpen(mycol, myrow, fid) && checkClose(mycol, myrow)) { addToOpen(mycol, myrow, fid); } } // 左 mycol = col - 1; myrow = row; if(mycol >= 0 && checkMap(mycol, myrow)) { if(checkOpen(mycol, myrow, fid) && checkClose(mycol, myrow)) { addToOpen(mycol, myrow, fid); } } // 上 mycol = col; myrow = row + 1; if(myrow < _map->getMapSize().height && checkMap(mycol, myrow)) { if(checkOpen(mycol, myrow, fid) &&checkClose(myrow, myrow)) { addToOpen(mycol, myrow, fid); } } // 右 mycol = col + 1; myrow = row; if(mycol < _map->getMapSize().height && checkMap(mycol, myrow)) { if(checkOpen(mycol, myrow, fid) &&checkClose(myrow, myrow)) { addToOpen(mycol, myrow, fid); } } }
bool AstarFlexible::checkNearby() { int i=0,j=0,x=0,y=0,k=0,g=0,h=0; AstarNode* searchedNode; for(;k<DEFAULT_NEARS_LENGTH;k++){ //near=defaultNears[k]; i=defaultNears[k][0]; j=defaultNears[k][1]; x=m_current->getX()+i; y=m_current->getY()+j; //结束提前,可对目标是障碍物进行寻路。(例:人物要对某个建筑进行操作,比如攻击,要走到建筑旁边才可以) if (isEnd(x,y ,i ,j)) {//如果是斜着寻路,则要对旁边是否有障碍物进行判断。 return true;//查找成功 } if(!isOut(x,y) && isWorkableWithCrossSide(x ,y ,i ,j)){ if(!isInClose(x ,y)){ g=m_current->getG()+(i==0||j==0?ASTAR_G_LINE:ASTAR_G_CROSS); searchedNode=getFromOpen(x ,y); if(searchedNode!=NULL){ //在开起列表中,比较G值 if (g < searchedNode->getG()) { //有最小F值,重新排序 setOpenSeqNode(searchedNode,g); } }else { //没有搜索过,直接添加到开起列表中 h=getH(x ,y); AstarNode* astarNode=new AstarNode(); astarNode->init(x ,y,g,h); astarNode->setParent(m_current); addToOpen(astarNode); astarNode->release(); } } } } return false; }