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(); processTrackableStates();
// Update size // 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()); setSize(Game::getInstance()->window->getSize());
if (!trackables.empty()) if (!trackables.empty())
@ -78,15 +78,24 @@ sf::Vector2f TrackingView::getCenter() const
void TrackingView::followTarget() void TrackingView::followTarget()
{ {
auto trackingPoint = getCollectiveTrackingPoint(); auto trackingPoint = getCollectiveTrackingPoint();
if (DEVELOPER_MODE) {
marker->coordinates.set(IsometricCoordinates(trackingPoint)); marker->coordinates.set(IsometricCoordinates(trackingPoint));
moveCenter(trackingPoint - getCenter()); }
return;
// if (isTargetInArea(freeMoveArea)) // Calculate distance to target to check how to handle it
// { auto currentCenter = view->getCenter();
// // Nothing to do auto vectorToTarget = trackingPoint - currentCenter;
// return; 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(); // performHardFollow();
// if (isTargetInArea(dynamicFollowArea)) // if (isTargetInArea(dynamicFollowArea))
@ -108,6 +117,10 @@ void TrackingView::moveCenter(sf::Vector2<float> delta)
void TrackingView::draw(sf::RenderWindow *window) const void TrackingView::draw(sf::RenderWindow *window) const
{ {
if (!DEVELOPER_MODE) {
return;
}
marker->draw(window); marker->draw(window);
} }
@ -161,3 +174,9 @@ void TrackingView::processTrackableStates()
return trackable->getTrackableState() == TrackableState::END_TRACKING; 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; sf::Vector2f getCollectiveTrackingPoint() const;
void processTrackableStates(); void processTrackableStates();
void setCenter(sf::Vector2<float> newCenter);
}; };

View file

@ -4,15 +4,21 @@
#include <SFML/System/Vector2.hpp> #include <SFML/System/Vector2.hpp>
#include <valarray> #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> template<typename T>
sf::Vector2<T> normalize(sf::Vector2<T> v) 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.x /= vectorLength;
v.y /= length; v.y /= vectorLength;
} }
return v; return v;
} }