holesome/src/game/world/world_view.h

58 lines
1.3 KiB
C
Raw Normal View History

2023-05-09 20:50:50 +02:00
#ifndef HOLESOME_WORLD_VIEW_H
#define HOLESOME_WORLD_VIEW_H
#include "../game_object.h"
#include "../game.h"
#include "ITrackable.h"
#include "../../primitives/circle_object.h"
2023-05-09 20:50:50 +02:00
2023-05-10 11:03:14 +02:00
class WorldView : public GameObject
2023-05-09 20:50:50 +02:00
{
public:
explicit WorldView(ITrackable *trackable = nullptr,
sf::Vector2f freeMoveArea = {200, 200},
sf::Vector2f dynamicFollowArea = {500, 500});
2023-05-09 20:50:50 +02:00
~WorldView();
2023-05-09 20:50:50 +02:00
void draw(sf::RenderWindow *window) const override;
void lateUpdate(Game *game) override;
2023-05-09 20:50:50 +02:00
sf::Vector2f getSize() const;
sf::Vector2f getCenter() const;
2023-05-09 20:50:50 +02:00
private:
sf::View *view{};
bool hasViewChanged{};
sf::Vector2f freeMoveArea;
sf::Vector2f dynamicFollowArea;
ITrackable *target;
CircleObject *marker;
2023-05-10 11:03:14 +02:00
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 direction 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();
2023-05-09 20:50:50 +02:00
};
#endif //HOLESOME_WORLD_VIEW_H