Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.98 KB | None | 0 0
  1. float calcH(Tile* current, Tile* target, Tile* start)
  2. {
  3.     //float H = 10*(abs(current->tileX-target->tileX) + abs(current->tileY-target->tileY));
  4.     //float deltaX = current->tileX-target->tileX;
  5.     //float deltaY = current->tileY-target->tileY;
  6.     //float H = sqrtf((deltaX*deltaX)+(deltaY*deltaY));
  7.  
  8.     /*float dx1 = current->tileX - target->tileX;
  9.     float dy1 = current->tileY - target->tileY;
  10.     float dx2 = start->tileX - target->tileX;
  11.     float dy2 = start->tileY - target->tileY;
  12.     float cross = abs(dx1*dy2 - dx2*dy1);
  13.     H += cross*0.026545;*/
  14.  
  15.     const int DiagCost = 14;
  16.     const int NormalCost = 10;
  17.     // distance code
  18.     int dx = abs(current->tileX - target->tileX);
  19.     int dy = abs(current->tileY - target->tileY);
  20.     int diag = min(dx, dy);
  21.     int straight = dx + dy - (diag << 1);
  22.     int H = DiagCost * diag + NormalCost * straight;
  23.  
  24.     return H;
  25. }
  26.  
  27. bool find(std::vector<Tile*>& closed, Tile* tile)
  28. {
  29.     for(int i = 0;i<closed.size();i++)
  30.     {
  31.         if(closed[i] == tile)
  32.             return true;
  33.     }
  34.     return false;
  35. }
  36.  
  37. void PathFinder::Init()
  38. {
  39. }
  40.  
  41. Tile* PathFinder::FindPath(int objectID, Tile* current, Tile* target, std::vector<Tile*>& closed)
  42. {
  43.     return current;
  44. }
  45.  
  46. bool sort_function (Tile* i, Tile* j) { return (i->F<j->F); }
  47.  
  48. std::vector<Tile*> PathFinder::FindPath2(Tile* current, Tile* target)
  49. {
  50.     std::vector<Tile*> open;
  51.     std::vector<Tile*> closed;
  52.  
  53.     open.push_back(current);
  54.  
  55.     Tile* curr = 0;
  56.     bool done = false;
  57.  
  58.     //Phase 2
  59.     int checks = 0;
  60.     while(curr != target && !done && open.size() > 0)
  61.     {
  62.         if(open.size() == 1)
  63.         {
  64.             curr = open[0];
  65.             open.pop_back();
  66.             closed.push_back(curr);
  67.         }else{
  68.             std::sort(open.begin(), open.end(), sort_function);
  69.             Tile* temp = open.front();
  70.             open.erase(open.begin());
  71.             closed.push_back(temp);
  72.  
  73.             curr = temp;
  74.         }
  75.         checks++;
  76.  
  77.         Tile* tile1 = root->map->GetTile1(curr->tileX-1, curr->tileY-1);
  78.         Tile* tile2 = root->map->GetTile1(curr->tileX,   curr->tileY-1);
  79.         Tile* tile3 = root->map->GetTile1(curr->tileX+1, curr->tileY-1);
  80.         Tile* tile4 = root->map->GetTile1(curr->tileX+1, curr->tileY);
  81.         Tile* tile5 = root->map->GetTile1(curr->tileX+1, curr->tileY+1);
  82.         Tile* tile6 = root->map->GetTile1(curr->tileX,   curr->tileY+1);
  83.         Tile* tile7 = root->map->GetTile1(curr->tileX-1, curr->tileY+1);
  84.         Tile* tile8 = root->map->GetTile1(curr->tileX-1, curr->tileY);
  85.    
  86.         if((!tile1 || tile1->isTaken) && (!tile2 || tile2->isTaken) && (!tile3 || tile3->isTaken) && (!tile4 || tile4->isTaken) && (!tile5 || tile5->isTaken) && (!tile6 || tile6->isTaken) && (!tile7 || tile7->isTaken) && (!tile8 || tile8->isTaken))
  87.         {
  88.             //done = true;
  89.             continue;
  90.         }
  91.  
  92.         std::vector<Tile*> tempList;
  93.  
  94.         if(tile1 && !tile1->isTaken)
  95.             tempList.push_back(tile1);
  96.  
  97.         if(tile2 && !tile2->isTaken)
  98.             tempList.push_back(tile2);
  99.  
  100.         if(tile3 && !tile3->isTaken)
  101.             tempList.push_back(tile3);
  102.  
  103.         if(tile4 && !tile4->isTaken)
  104.             tempList.push_back(tile4);
  105.  
  106.         if(tile5 && !tile5->isTaken)
  107.             tempList.push_back(tile5);
  108.  
  109.         if(tile6 && !tile6->isTaken)
  110.             tempList.push_back(tile6);
  111.  
  112.         if(tile7 && !tile7->isTaken)
  113.             tempList.push_back(tile7);
  114.  
  115.         if(tile8 && !tile8->isTaken)
  116.             tempList.push_back(tile8);
  117.  
  118.         for(int i = 0;i<tempList.size();i++)
  119.         {
  120.             if(find(closed, tempList[i]))
  121.             {
  122.             }else if(find(open, tempList[i]))
  123.             {
  124.                 Tile* parent = tempList[i]->parent;
  125.                 bool diag2 = (curr->tileX == tempList[i]->tileX-1 && curr->tileY == tempList[i]->tileY-1) || (curr->tileX == tempList[i]->tileX+1 && curr->tileY == tempList[i]->tileY-1) || (curr->tileX == tempList[i]->tileX+1 && curr->tileY == tempList[i]->tileY+1) || (curr->tileX == tempList[i]->tileX-1 && curr->tileY == tempList[i]->tileY+1);
  126.  
  127.                 int tempG;
  128.                 tempG = (diag2)?14:10;
  129.                 if(curr->G + tempG < tempList[i]->G)
  130.                 {
  131.                     tempList[i]->G = tempG;
  132.                     tempList[i]->F = tempList[i]->G+tempList[i]->H;
  133.                     tempList[i]->parent = curr;
  134.                 }
  135.             }else{
  136.                 /*if(tempList[i] == target)
  137.                 {
  138.                     tempList[i]->parent = curr;
  139.                     curr = tempList[i];
  140.                     break;
  141.                 }*/
  142.  
  143.                 bool diag = (curr->tileX == tempList[i]->tileX-1 && curr->tileY == tempList[i]->tileY-1) || (curr->tileX == tempList[i]->tileX+1 && curr->tileY == tempList[i]->tileY-1) || (curr->tileX == tempList[i]->tileX+1 && curr->tileY == tempList[i]->tileY+1) || (curr->tileX == tempList[i]->tileX-1 && curr->tileY == tempList[i]->tileY+1);
  144.                
  145.                 if(diag)
  146.                     tempList[i]->G = curr->G + 14;//1.414;
  147.                 else
  148.                     tempList[i]->G = curr->G + 10;
  149.  
  150.                 tempList[i]->H = calcH(tempList[i], target, current);
  151.                 tempList[i]->F = tempList[i]->G+tempList[i]->H;
  152.                 tempList[i]->parent = curr;
  153.  
  154.                 if(open.size() > 0)
  155.                 {
  156.                     open.push_back(tempList[i]);
  157.                 }else{
  158.                     open.push_back(tempList[i]);
  159.                 }
  160.             }
  161.         }
  162.     }
  163.  
  164.     std::vector<Tile*> path;
  165.     closed.push_back(curr);
  166.  
  167.     if(curr)
  168.     {
  169.         while(curr != current)
  170.         {
  171.             path.push_back(curr);
  172.             curr = curr->parent;
  173.         }
  174.     }
  175.  
  176.     root->debugRenderer->setDebugPathPoints(closed);
  177.     std::cout << checks << ", " << path.size() << std::endl;
  178.     return path;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement