Implemented free-move-area tracking

This commit is contained in:
Maximilian Giller 2023-05-24 15:21:53 +02:00
parent d085e9f54c
commit 8816cedca4
3 changed files with 40 additions and 13 deletions

View file

@ -28,7 +28,7 @@ void TrackingView::lateUpdate()
processTrackableStates();
// Update size
// TODO: Update size based on distance of tracked objects
// TODO: Update size based on length of tracked objects
setSize(Game::getInstance()->window->getSize());
if (!trackables.empty())
@ -78,15 +78,24 @@ sf::Vector2f TrackingView::getCenter() const
void TrackingView::followTarget()
{
auto trackingPoint = getCollectiveTrackingPoint();
if (DEVELOPER_MODE) {
marker->coordinates.set(IsometricCoordinates(trackingPoint));
moveCenter(trackingPoint - getCenter());
return;
}
// if (isTargetInArea(freeMoveArea))
// {
// // Nothing to do
// return;
// }
// Calculate distance to target to check how to handle it
auto currentCenter = view->getCenter();
auto vectorToTarget = trackingPoint - currentCenter;
float distanceToTarget = length(vectorToTarget);
if (distanceToTarget <= freeMoveRadius)
{
// Nothing to do
return;
}
// Move view to place tracking-point at edge of area
auto deltaToDesiredView = normalize(vectorToTarget) * (distanceToTarget - freeMoveRadius);
moveCenter(deltaToDesiredView);
// performHardFollow();
// if (isTargetInArea(dynamicFollowArea))
@ -108,6 +117,10 @@ void TrackingView::moveCenter(sf::Vector2<float> delta)
void TrackingView::draw(sf::RenderWindow *window) const
{
if (!DEVELOPER_MODE) {
return;
}
marker->draw(window);
}
@ -161,3 +174,9 @@ void TrackingView::processTrackableStates()
return trackable->getTrackableState() == TrackableState::END_TRACKING;
});
}
void TrackingView::setCenter(sf::Vector2<float> newCenter)
{
view->setCenter(newCenter);
hasViewChanged = true;
}

View file

@ -47,6 +47,8 @@ private:
sf::Vector2f getCollectiveTrackingPoint() const;
void processTrackableStates();
void setCenter(sf::Vector2<float> newCenter);
};

View file

@ -4,15 +4,21 @@
#include <SFML/System/Vector2.hpp>
#include <valarray>
template<typename T>
float length(sf::Vector2<T> v)
{
return std::sqrt(v.x * v.x + v.y * v.y);
}
template<typename T>
sf::Vector2<T> normalize(sf::Vector2<T> v)
{
auto length = std::sqrt(v.x * v.x + v.y * v.y);
auto vectorLength = length(v);
if (length != 0)
if (vectorLength != 0)
{
v.x /= length;
v.y /= length;
v.x /= vectorLength;
v.y /= vectorLength;
}
return v;
}