Added representation of occupied squares and a way to retrieve them for A* implementation

Updated UML
This commit is contained in:
Teo-CD 2019-06-08 02:32:06 +02:00
parent d53f8b32e9
commit 1a79679c21
6 changed files with 95 additions and 5 deletions

View file

@ -15,6 +15,10 @@ Level::Level(const pugi::xml_document& xmlDoc, const TextureStore& textureStore)
if(!strncmp(child.name(),"Entity",6))
{
entities.emplace_back(child,textures.at(child.attribute("textureId").as_int(0)).get());
// Initialize the occupied squares vector with the new entity's squares
std::vector<std::pair<uint8_t,uint8_t>> entitySquares = entities.rbegin()->getOccupiedSquares();
std::move(entitySquares.begin(),entitySquares.end(),std::back_inserter(occupiedSquares));
}
}
}
@ -29,9 +33,47 @@ void Level::render(sf::RenderWindow& renderWindow) const
void Level::runStep()
{
std::vector<std::pair<uint8_t,uint8_t>> newOccupiedSquares{};
newOccupiedSquares.reserve(occupiedSquares.size());
for(Entity& entity: entities)
{
// FIXME : For testing purposes
entity.move();
entity.update();
int heuristicSign = 0;
switch (entity.getState())
{
case State::Moving:
{
heuristicSign = 1;
}
case State::Fleeing:
{
if(heuristicSign == 0)
{
heuristicSign = -1;
}
if(entity.target != entity.getPosition())
{
entity.move(findPath(entity.getPosition(),entity.target,heuristicSign));
}
break;
}
case State::Waiting:break;
case State::Idle:break;
}
// Moves the occupied squares from the entity to the new occupied squares vector
std::vector<std::pair<uint8_t,uint8_t>> entitySquares = entity.getOccupiedSquares();
std::move(entitySquares.begin(),entitySquares.end(),std::back_inserter(newOccupiedSquares));
}
occupiedSquares.swap(newOccupiedSquares);
// Sort the vector as to get O(ln(n)) complexity when searching for a square
std::sort(occupiedSquares.begin(),occupiedSquares.end());
}
Orientation Level::findPath(sf::Vector2i start, sf::Vector2i end, int sign)
{
// TODO : A* which returns the next move
return Orientation::East;
}