Пример #1
0
//Runs A* on every tile on the edge of the speed radius, thus getting distances for all intervening tiles.
void Level::GetPaths(int x, int y, int speed)
{
	for(int i = 0; i <= speed + 1; i++)
	{
		//Find paths for tile in each quadrant, redundancies foregone
		if(x + i < map.size() && y + speed - i < map[0].size() && map[x + i][y + speed - i])
			if(map[x + i][y + speed - i]->IsWalkable() && i != 0 && speed - i !=0)
			{
				map[x + i][y + speed - i]->SetPath(Pathfind(x, y, x + i, y + speed - i, speed));
				OpenNodes();
			}
		if(x + i < map.size() && y - speed + i < map[0].size() && map[x + i][y - speed + i])
			if(map[x + i][y - speed + i]->IsWalkable() && speed - i != 0)
			{
				map[x + i][y - speed + i]->SetPath(Pathfind(x, y, x + i, y - speed + i, speed));
				OpenNodes();
			}
		if(x - i < map.size() && y - speed + i < map[0].size() && map[x - i][y - speed + i])
			if(map[x - i][y - speed + i]->IsWalkable() && i != 0 && speed - i !=0)
			{
				map[x - i][y - speed + i]->SetPath(Pathfind(x, y, x - i, y - speed + i, speed));
				OpenNodes();
			}
		if(x - i < map.size() && y + speed - i < map[0].size() && map[x - i][y + speed - i])
			if(map[x - i][y + speed - i]->IsWalkable() && i != 0)
			{
				map[x - i][y + speed - i]->SetPath(Pathfind(x, y, x - i, y + speed - i, speed));
				OpenNodes();
			}
	}
}
void
DijkstraPathfinder::init(Pos& arg_start, Pos& arg_end)
{
  start = arg_start;
  end   = arg_end;

  path.clear();

  if (start.x == end.x
      && start.y == end.y)
    {
      state = ALREADY_ON_GOAL;
      return;
    }

  // initing node_field
  for(int y = 0; y < node_field.get_height(); ++y)
    for(int x = 0; x < node_field.get_width(); ++x)
      {
        Node& node = node_field(x,y);

        node.visited = 0;
        node.parent  = PARENT_NONE;
        node.cost    = 0;
        node.x = x;
        node.y = y;
      }
  
  open_nodes = OpenNodes();

  state = WORKING;

  Node& node = node_field(start.x, start.y);
  
  node.visited = 1;
  node.cost    = 0;
  node.parent  = PARENT_GOAL;

  make_neighbors_open(node);
}