holesome/src/game/camera/tracking_view.h

62 lines
1.4 KiB
C++

#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<ITrackable *> 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<float> delta);
void performDynamicFollow();
sf::Vector2f getCollectiveTrackingPoint() const;
void processTrackableStates();
};
#endif //HOLESOME_TRACKING_VIEW_H