Libsdl2pp

C++ bindings/wrapper for SDL2
Alternatives To Libsdl2pp
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Openrct211,886
a day ago1,521gpl-3.0C++
An open source re-implementation of RollerCoaster Tycoon 2 🎢
Devilutionx6,444
2 days ago331otherC++
Diablo build for modern operating systems
Magnum4,407
7 days ago91otherC++
Lightweight and modular C++11 graphics middleware for games and data visualization
Vcmi3,232
2 days ago340gpl-2.0C++
Open-source engine for Heroes of Might and Magic III
Xray 162,375
2 days ago226otherC++
Improved version of the X-Ray Engine, the game engine used in the world-famous S.T.A.L.K.E.R. game series by GSC Game World. Join OpenXRay! ;)
Teeworlds2,119
19 days ago376otherC++
A retro multiplayer shooter
Antimicro1,681
6 months ago240C++
[NOT maintained anymore] Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support
Sdl Gpu1,017
a year ago71mitC
A library for high-performance, modern 2D graphics with SDL written in C.
Openspades1,013
13 days ago237gpl-3.0C++
Compatible client of Ace of Spades 0.75
Lagrange999
2 days ago112bsd-2-clauseC
A Beautiful Gemini Client
Alternatives To Libsdl2pp
Select To Compare


Alternative Project Comparisons
Readme
libsdl2pp packaging status

CI Github commits (since latest release)

libSDL2pp

This library provides C++ bindings/wrapper for SDL2 and satellite libraries.

Synopsis

try {
  using namespace SDL2pp;

  // Init SDL; will be automatically deinitialized when the object is destroyed
  SDL sdl(SDL_INIT_VIDEO | SDL_INIT_AUDIO);

  // Likewise, init SDL_ttf library
  SDLTTF sdl_ttf;

  // Straightforward wrappers around corresponding SDL2 objects
  // These take full care of proper object destruction and error checking
  Window window("libSDL2pp demo",
                SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                640, 480, SDL_WINDOW_RESIZABLE);
  Renderer renderer(window, -1, SDL_RENDERER_ACCELERATED);
  Texture sprite1(renderer, SDL_PIXELFORMAT_ARGB8888,
                            SDL_TEXTUREACCESS_STATIC, 16, 16);
  Texture sprite2(renderer, "sprite.png"); // SDL_image support

  Font font("Vera.ttf", 20); // SDL_ttf font

  // Initialize audio mixer
  Mixer mixer(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 4096);

  Chunk sound("effect.ogg"); // OGG sound file

  // Create texture from surface containing text rendered by SDL_ttf
  Texture text(renderer, font.RenderText_Solid("Hello, world!",
               SDL_Color{255, 255, 255, 255}));

  unsigned char pixels[16 * 16 * 4];

  // Note proper constructor for Rect
  sprite1.Update(Rect(0, 0, 16, 16), pixels, 16 * 4);

  // Most setter methods are chainable
  renderer.SetLogicalSize(640, 480).SetDrawColor(0, 16, 32).Clear();

  // Also note a safe way to specify null rects and points
  renderer.Copy(sprite1, NullOpt, NullOpt);

  // There are multiple convenient ways to construct e.g. a Rect;
  // Objects provide extensive set of getters
  renderer.Copy(text, NullOpt, Rect(Point(0, 0), text.GetSize()));

  // Copy() is overloaded, providing access to both SDL_RenderCopy and SDL_RenderCopyEx
  renderer.Copy(sprite2, NullOpt, NullOpt, 45.0);

  renderer.Present();

  // Play our sound one time on a first available mixer channel
  mixer.PlayChannel(-1, sound);

  // You can still access wrapped C SDL types
  SDL_Renderer* sdl_renderer = renderer.Get();

  // Of course, C SDL2 API is still perfectly valid
  SDL_Delay(2000);

  // All SDL objects are released at this point or if an error occurs
} catch (SDL2pp::Exception& e) {
  // Exception stores SDL_GetError() result and name of function which failed
  std::cerr << "Error in: " << e.GetSDLFunction() << std::endl;
  std::cerr << "  Reason: " << e.GetSDLError() << std::endl;
} catch (std::exception& e) {
  // This also works (e.g. "SDL_Init failed: No available video device")
  std::cerr << e.what() << std::endl;
}

There's also more elaborate tutorial.

Features

Currently, the library provides wrapper classes for

  • SDL
    • Library initialization/deinitialization
    • Audio
      • Audio device
      • WAV-related functions
      • SDL_AudioSpec
    • Graphics
      • SDL_Point
      • SDL_Rect
      • SDL_Renderer
      • SDL_Surface
      • SDL_Texture
      • SDL_Window
    • I/O
      • SDL_RWops
  • SDL_image
    • Library initialization/deinitialization
    • Loading functions integrated into Texture and Surface
  • SDL_mixer
    • Library initialization/deinitialization
    • Sound sample handling (Mix_Chunk)
    • Music handling (Mix_Music)
    • Mixer class which encapsulates device handling and all playback functions
  • SDL_ttf
    • Library initialization/deinitialization
    • TTF_Font (all functions covered)

each with a subset of methods corresponding to SDL functions working with specific types of objects and, in some cases, additional convenience methods. These classes support:

  • RAII-style initialization and destruction, automatic resource lifetime control (you no longer need to care of manually freeing your stuff)
  • Total error checking: exceptions are thrown if any SDL function fails. Exception itself allows retrieval of SDL error string (you no longer need to manually check return code after each function call)
  • Method overloading, default arguments, method chaining allow shorter and cleaner code
  • Move semantics support, which allow you to store SDL objects in containers and pass/return them by value without noticeable overhead

Set of functional extensions above SDL2 is also available:

  • RWops adapters for C++ containers and streams
  • Optional object to safely handle values which may not be present, (for which SDL2 usually uses NULL pointers)
  • Number of additional methods and operator support for Point and Rect

Building

Dependencies:

To build standalone version:

cmake .
cmake --build .

Following variables may be supplied to CMake to affect build:

  • SDL2PP_WITH_IMAGE - enable SDL_image support (default ON)
  • SDL2PP_WITH_MIXER - enable SDL_mixer support (default ON)
  • SDL2PP_WITH_TTF - enable SDL_ttf support (default ON)
  • SDL2PP_WITH_EXAMPLES - enable building example programs (only for standalone build, default ON)
  • SDL2PP_WITH_TESTS - enable building tests (only for standalone build, default ON)
  • SDL2PP_STATIC - build static library instead of shared (only for standalone build, default OFF)
  • SDL2PP_ENABLE_LIVE_TESTS - enable tests which require X11 and/or audio device to run (only for standalone build, default ON)

Installation

To install the library system-wide, run:

cmake .
cmake --build .
cmake --install .

You can change installation prefix with CMAKE_INSTALL_PREFIX cmake variable:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local .
cmake --build .
cmake --install .

SDL2pp installs pkg-config file, so it can be used with any build system that interacts with pkg-config, including CMake, meson and GNU Autotools. It also installs CMake module file, which can be used from CMake directly:

find_package(SDL2pp REQUIRED)

target_link_libraries(mytarget SDL2pp::SDL2pp)

Bundling

The library is easy to integrate into other CMake projects (and as the library has no stable API yet, this way of using it is still recommended).

Just place the library into dedicated directory in your project (for example, extlib/libSDL2pp) and add

set(SDL2PP_WITH_IMAGE ON) # if you need SDL_image support
set(SDL2PP_WITH_MIXER ON) # if you need SDL_mixer support
set(SDL2PP_WITH_TTF ON) # if you need SDL_ttf support
add_subdirectory(extlib/libSDL2pp)

into your core CMakeLists.txt. This will act similar to how find_package usually does, and will provide SDL2pp::SDL2pp target for your project. You will then be able it as usual:

target_link_libraries(mytarget SDL2pp::SDL2pp)

If bundled, libSDL2pp does not build examples and becomes a static library. See hoverboard project as an example of using both bundled and systemwide SDL2pp.

Completeness

The library still doesn't cover all aspects of SDL2, and the development is generally guided by the author's needs and interest without a goal for covering all SDL2 functions as soon as possible. However, if you need specific bits which are not yet implemented in the library, feel free to drop an issue. Patches are of course more than welcome.

It should be noted, however, that I currently do not plan to implement any wrappers over non object-oriented SDL2 code, as these will not bring any benefits over using plain C API. E.g. I see no point in implementing SDL2pp::Delay() as it won't bring any convenience over SDL_Delay().

The same strongly applies to the SDL2 bits which duplicate C++17 standard library, e.g. threads and atomic ops.

Users

Projects using libSDL2pp:

  • fontbm - Command line font generator, compatible with BMFont
  • hoverboard-sdl - Desktop version of xkcd 1608 "Hoverboard" game
  • neopedersia - Nexus Wars style game
  • OpenDaed - Libre reimplementation of The Daedalus Encounter game
  • OpenStrike - Libre reimplementation of Jungle and Desert Strike games
  • osmview - Desktop OpenStreetMap viewer
  • planetonomy - Old-school platformer/exploration game with CGA graphics

WWW

Author

Contributors

License

libSDL2pp comes under zlib license, the same license as SDL2. See COPYING.txt.

Popular Sdl Projects
Popular Cmake Projects
Popular Graphics Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
C Plus Plus
Cmake
Graphics
Game Development
Sdl