Yes! We can create smooth window animations by gradually updating the window position over time. Here's how to implement smooth window movement:
Here’s a basic implementation of an AnimatedWindow
 class:
// AnimatedWindow.h
#pragma once
#include <SDL.h>
#include <chrono>
#include "Window.h"
using std::chrono::steady_clock,
std::chrono::duration;
class AnimatedWindow : public Window {
public:
void AnimateTo(
int TargetX, int TargetY,
float DurationSeconds = 0.5f
) {
// Get start position
SDL_GetWindowPosition(
SDLWindow, &StartX, &StartY);
// Set target and calculate distance
this->TargetX = TargetX;
this->TargetY = TargetY;
// Start animation
AnimationStart = steady_clock::now();
AnimationDuration = duration<float>(
DurationSeconds);
IsAnimating = true;
}
void Update() {
if (!IsAnimating) return;
// Calculate progress (0.0 to 1.0)
auto Now = steady_clock::now();
auto Elapsed = Now - AnimationStart;
float Progress = std::min(
1.0f, Elapsed / AnimationDuration);
// Use ease-out for smooth deceleration
float Smoothed = 1.0f - (1.0f - Progress)
* (1.0f - Progress);
// Calculate current position
int CurrentX = StartX + (TargetX - StartX)
* Smoothed;
int CurrentY = StartY + (TargetY - StartY)
* Smoothed;
// Update window position
SDL_SetWindowPosition(
SDLWindow, CurrentX, CurrentY);
// Check if animation is complete
if (Progress >= 1.0f) {
IsAnimating = false;
}
}
private:
bool IsAnimating{false};
int StartX{0}, StartY{0};
int TargetX{0}, TargetY{0};
steady_clock::time_point AnimationStart;
duration<float> AnimationDuration;
};
Here's how to use our animated window class:
#include <SDL.h>
#include <iostream>
#include "AnimatedWindow.h"
int main(int argc, char** argv) {
SDL_Init(SDL_INIT_VIDEO);
AnimatedWindow Window;
SDL_Event E;
// Center window initially
SDL_SetWindowPosition(Window.SDLWindow,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED);
while (true) {
while (SDL_PollEvent(&E)) {
if (E.type == SDL_KEYDOWN) {
// Animate to corners on arrow key press
switch (E.key.keysym.sym) {
case SDLK_LEFT:
Window.AnimateTo(0, 300);
break;
case SDLK_RIGHT:
Window.AnimateTo(800, 300);
break;
}
}
}
Window.Update();
}
SDL_Quit();
return 0;
}
We can create different animation feels by modifying the easing function:
// Linear (constant speed)
float Linear(float t) { return t; }
// Ease-out (start fast, end slow)
float EaseOut(float t) {
return 1.0f - (1.0f - t) * (1.0f - t);
}
// Ease-in (start slow, end fast)
float EaseIn(float t) { return t * t; }
// Bounce
float Bounce(float t) {
if (t < 0.5f) {
return 4.0f * t * t * t;
} else {
float f = 2.0f * t - 2.0f;
return 0.5f * f * f * f + 1.0f;
}
}
The key to smooth animation is:
Remember that frequent window updates can be resource-intensive, so use animation judiciously and consider providing an option to disable it for users who prefer instant movement.
Answers to questions are automatically generated and may not have been reviewed.
Learn how to control and monitor the position of SDL windows on screen