Added Camera freemove and follow. Camera returns to follow target if free-movement isn't done for 1.25 seconds

This commit is contained in:
2025-03-19 02:42:20 -04:00
parent b2e4732b14
commit 4e0c1dac86
2 changed files with 28 additions and 11 deletions

View File

@@ -135,6 +135,8 @@ namespace CaveGame::Client
float move_smoothing = 0.975f;
bool lerp_to_target = true;
bool freecam = true;
float free_move_cooldown = 1.25f;
float last_free_move = 0.f;
private:
// https://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/
};

View File

@@ -32,14 +32,19 @@ namespace CaveGame::Client
if (InputService::IsKeyDown(Keys::RightBracket))
Rotate(5.f*elapsed);
if (InputService::IsKeyDown(Keys::Minus))
if (InputService::IsKeyDown(Keys::Minus) || jstick::IsButtonDown(jstick::XBoxButton::Back))
ZoomOut(elapsed);
if (InputService::IsKeyDown(Keys::Equals))
if (InputService::IsKeyDown(Keys::Equals) || jstick::IsButtonDown(jstick::XBoxButton::Start))
ZoomIn(elapsed);
}
void Camera2D::Update(float elapsed) {
last_free_move += elapsed;
float t = 1 - move_smoothing;
float step = 1.f - Math::Pow(t, elapsed);
//float step = Math::Exp(- (move_smoothing*elapsed) );
@@ -47,10 +52,16 @@ namespace CaveGame::Client
if (freecam)
UpdateFreecamControls(elapsed);
if (lerp_to_target)
position = Vector2::Lerp(position, target, step);
else
position = target;
if (last_free_move >= free_move_cooldown)
{
if (lerp_to_target)
position = Vector2::Lerp(position, target, step);
else
position = target;
} else {
}
// If **really** close, snap to the final position to stabilize.
if (position.DistanceSq(target) < 1e-7f) {
@@ -106,24 +117,28 @@ namespace CaveGame::Client
Vector2 Camera2D::Position() const { return position; }
void Camera2D::MoveLeft(float rate) {
target -= Vector2(move_speed * rate, 0);
position -= Vector2(move_speed * rate, 0);
}
void Camera2D::Move(const Vector2& velocity)
{
target += velocity * move_speed;
position += velocity * move_speed;
last_free_move = 0;
}
void Camera2D::MoveRight(float rate) {
target += Vector2(move_speed * rate, 0);
position += Vector2(move_speed * rate, 0);
last_free_move = 0;
}
void Camera2D::MoveUp(float rate) {
target -= Vector2(0, move_speed * rate);
position -= Vector2(0, move_speed * rate);
last_free_move = 0;
}
void Camera2D::MoveDown(float rate) {
target += Vector2(0, move_speed * rate);
position += Vector2(0, move_speed * rate);
last_free_move = 0;
}
void Camera2D::PassViewportSize(const Vector2 &size) {