// // Created by trotfunky on 06/06/19. // #include "Level.h" Level::Level(const pugi::xml_document& xmlDoc, const TextureStore& textureStore) : textures(textureStore), size(xmlDoc.child("Level").attribute("width").as_int(),xmlDoc.child("Level").attribute("width").as_int()) { pugi::xml_node levelNode = xmlDoc.child("Level"); for(const pugi::xml_node& child : levelNode.children()) { 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> entitySquares = entities.rbegin()->getOccupiedSquares(); std::move(entitySquares.begin(),entitySquares.end(),std::back_inserter(occupiedSquares)); } } } void Level::render(sf::RenderWindow& renderWindow) const { for(const Entity& entity : entities) { renderWindow.draw(entity.getShape()); } } void Level::runStep() { std::vector> newOccupiedSquares{}; newOccupiedSquares.reserve(occupiedSquares.size()); for(Entity& entity: entities) { 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> 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; }