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:
@@ -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/
|
||||
};
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user