From 8816cedca4411873781b90ae463e8603ac972d8e Mon Sep 17 00:00:00 2001 From: Maximilian Giller Date: Wed, 24 May 2023 15:21:53 +0200 Subject: [PATCH] Implemented free-move-area tracking --- src/game/camera/tracking_view.cpp | 37 +++++++++++++++++++++++-------- src/game/camera/tracking_view.h | 2 ++ src/utilities/vector_utils.hpp | 14 ++++++++---- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/game/camera/tracking_view.cpp b/src/game/camera/tracking_view.cpp index b867d3a..220ff60 100644 --- a/src/game/camera/tracking_view.cpp +++ b/src/game/camera/tracking_view.cpp @@ -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(); - marker->coordinates.set(IsometricCoordinates(trackingPoint)); - moveCenter(trackingPoint - getCenter()); - return; + if (DEVELOPER_MODE) { + marker->coordinates.set(IsometricCoordinates(trackingPoint)); + } -// 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 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 newCenter) +{ + view->setCenter(newCenter); + hasViewChanged = true; +} diff --git a/src/game/camera/tracking_view.h b/src/game/camera/tracking_view.h index 4844a61..2547ee3 100644 --- a/src/game/camera/tracking_view.h +++ b/src/game/camera/tracking_view.h @@ -47,6 +47,8 @@ private: sf::Vector2f getCollectiveTrackingPoint() const; void processTrackableStates(); + + void setCenter(sf::Vector2 newCenter); }; diff --git a/src/utilities/vector_utils.hpp b/src/utilities/vector_utils.hpp index 65c8bad..f1c8653 100644 --- a/src/utilities/vector_utils.hpp +++ b/src/utilities/vector_utils.hpp @@ -4,15 +4,21 @@ #include #include +template +float length(sf::Vector2 v) +{ + return std::sqrt(v.x * v.x + v.y * v.y); +} + template sf::Vector2 normalize(sf::Vector2 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; }