#ifndef HOLESOME_TRACKING_VIEW_H #define HOLESOME_TRACKING_VIEW_H #include "../game_object.h" #include "../game.h" #include "ITrackable.h" #include "../../primitives/circle_object.h" class TrackingView : public GameObject { public: explicit TrackingView(float freeMoveRadius = 150, float dynamicFollowRadius = 300); ~TrackingView(); void draw(sf::RenderWindow *window) const override; void lateUpdate(Game *game) override; void addTrackable(ITrackable *trackable); sf::Vector2f getSize() const; sf::Vector2f getCenter() const; private: sf::View *view{}; bool hasViewChanged{}; float freeMoveRadius; float dynamicFollowRadius; std::vector trackables; CircleObject *marker; void initializeView(Game *game); void setSize(sf::Vector2u windowSize); void followTarget(); bool isTargetInArea(sf::Vector2f areaSize); sf::Vector2f getClosestPositionInArea(sf::Vector2f areaSize) const; /// Calculates the hardDirection the target should be pulled back in. /// \return Normalized vector, pointing from center to target. sf::Vector2f getRubber() const; void performHardFollow(); void moveCenter(sf::Vector2 delta); void performDynamicFollow(); sf::Vector2f getCollectiveTrackingPoint() const; void processTrackableStates(); }; #endif //HOLESOME_TRACKING_VIEW_H