Who: Created by Sam Lantinga while working at Loki Software.
Why: To provide a cross-platform abstraction layer for graphics, audio, and input — enabling games to run on Windows, Linux, macOS, and consoles from a single codebase.
When: SDL 1.0 released in 1998. SDL2 (major rewrite) released in 2013. SDL3 released in 2024.
Introduction
What is SDL2?
A cross-platform multimedia library providing low-level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL/Direct3D.
Used by thousands of games and emulators. Powers many indie games on Steam.
// Create hardware-accelerated rendererSDL_Renderer* renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);// Game loopbool running = true;SDL_Event event;while (running) { // Handle events while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) running = false; } // Clear screen (black) SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); // Draw a red rectangle SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); SDL_Rect rect = {100, 100, 200, 150}; SDL_RenderFillRect(renderer, &rect); // Draw a blue line SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); SDL_RenderDrawLine(renderer, 0, 0, 800, 600); // Present frame SDL_RenderPresent(renderer);}SDL_DestroyRenderer(renderer);
Input Handling
Keyboard
SDL_Event event;while (SDL_PollEvent(&event)) { if (event.type == SDL_KEYDOWN) { switch (event.key.keysym.sym) { case SDLK_ESCAPE: running = false; break; case SDLK_LEFT: player.x -= 5; break; case SDLK_RIGHT: player.x += 5; break; case SDLK_UP: player.y -= 5; break; case SDLK_DOWN: player.y += 5; break; } }}// Continuous key state (for smooth movement)const Uint8* keys = SDL_GetKeyboardState(nullptr);if (keys[SDL_SCANCODE_LEFT]) player.x -= speed;if (keys[SDL_SCANCODE_RIGHT]) player.x += speed;
Mouse
SDL_Event event;while (SDL_PollEvent(&event)) { if (event.type == SDL_MOUSEBUTTONDOWN) { if (event.button.button == SDL_BUTTON_LEFT) { int x = event.button.x; int y = event.button.y; SDL_Log("Clicked at %d, %d", x, y); } } if (event.type == SDL_MOUSEMOTION) { int mx = event.motion.x; int my = event.motion.y; }}