Implemented free-move-area tracking
This commit is contained in:
parent
d085e9f54c
commit
8816cedca4
3 changed files with 40 additions and 13 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -47,6 +47,8 @@ private:
|
|||
sf::Vector2f getCollectiveTrackingPoint() const;
|
||||
|
||||
void processTrackableStates();
|
||||
|
||||
void setCenter(sf::Vector2<float> newCenter);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue