From 21c7e3c73c4fe1df90f26aaeed5e47d144e52f8f Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov Date: Wed, 18 Dec 2013 03:41:27 +0400 Subject: [PATCH] Split demo into multiple programs to keep them simple and clear --- CMakeLists.txt | 13 ++++-- demo/lines.cc | 91 ++++++++++++++++++++++++++++++++++++ demo/{demo.cc => sprites.cc} | 64 ++++++++++--------------- 3 files changed, 123 insertions(+), 45 deletions(-) create mode 100644 demo/lines.cc rename demo/{demo.cc => sprites.cc} (57%) diff --git a/CMakeLists.txt b/CMakeLists.txt index fe79714..e03220f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,13 +35,16 @@ IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) ADD_LIBRARY(SDL2pp SHARED ${LIBRARY_SOURCES}) TARGET_LINK_LIBRARIES(SDL2pp ${SDL2_LIBRARY}) - # demo - SET(DEMO_SOURCES - demo/demo.cc + # demos + SET(DEMOS + sprites + lines ) - ADD_EXECUTABLE(demo ${DEMO_SOURCES}) - TARGET_LINK_LIBRARIES(demo SDL2pp) + FOREACH(DEMO ${DEMOS}) + ADD_EXECUTABLE(demo_${DEMO} demo/${DEMO}.cc) + TARGET_LINK_LIBRARIES(demo_${DEMO} SDL2pp) + ENDFOREACH(DEMO ${DEMOS}) ELSE(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) MESSAGE(STATUS "libSDL2pp bundled build") diff --git a/demo/lines.cc b/demo/lines.cc new file mode 100644 index 0000000..5ee93ad --- /dev/null +++ b/demo/lines.cc @@ -0,0 +1,91 @@ +/* + libSDL2pp - C++ wrapper for libSDL2 + Copyright (C) 2013 Dmitry Marakasov + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include + +#include + +#include + +using namespace SDL2pp; + +int Run() { + SDL sdl(SDL_INIT_VIDEO); + Window window("libSDL2pp demo: sprites", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_RESIZABLE); + Renderer render(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE); + + render.SetDrawBlendMode(SDL_BLENDMODE_BLEND); + + while (1) { + // Process input + SDL_Event event; + while (SDL_PollEvent(&event)) + if (event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && (event.key.keysym.sym == SDLK_ESCAPE || event.key.keysym.sym == SDLK_q))) + return 0; + + // Clear screen + render.SetDrawColor(0, 32, 32); + render.Clear(); + + // Render lines + render.SetDrawColor(255, 0, 0); + render.DrawLine(10, 10, 630, 10); + render.SetDrawColor(0, 255, 0); + render.DrawLine(630, 10, 630, 470); + render.SetDrawColor(0, 0, 255); + render.DrawLine(630, 470, 10, 470); + render.SetDrawColor(255, 255, 255); + render.DrawLine(10, 470, 10, 10); + + render.SetDrawColor(255, 255, 255, 127); + render.FillRect(0, 0, 20, 20); + render.SetDrawColor(255, 255, 255); + render.DrawRect(0, 0, 20, 20); + + // Pixel-perfectness test + render.SetDrawColor(192, 192, 192); + render.DrawLine(6, 2, 6, 10); + render.DrawLine(2, 6, 10, 6); + + render.SetDrawColor(255, 255, 255); + render.DrawRect(5, 5, 7, 7); + render.DrawRect(3, 3, 9, 9); + + render.Present(); + + // Frame limiter + SDL_Delay(1); + } + + return 0; +} + +int main() { + try { + return Run(); + } catch (Exception& e) { + std::cerr << "Error: " << e.what() << " (" << e.GetSDLError() << ")" << std::endl; + } catch (std::exception& e) { + std::cerr << "Error: " << e.what() << std::endl; + } + + return -1; +} diff --git a/demo/demo.cc b/demo/sprites.cc similarity index 57% rename from demo/demo.cc rename to demo/sprites.cc index f7767ad..51e4ed6 100644 --- a/demo/demo.cc +++ b/demo/sprites.cc @@ -37,61 +37,45 @@ unsigned char pixels[4 * 4 * 4] = { int Run() { SDL sdl(SDL_INIT_VIDEO); - Window window("libSDL2pp demo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_RESIZABLE); - Renderer render(window, -1, SDL_RENDERER_ACCELERATED); - Texture sprite(render, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, 4, 4); + Window window("libSDL2pp demo: sprites", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_RESIZABLE); + Renderer render(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE); + // Load sprite texture + Texture sprite(render, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, 4, 4); sprite.Update(Rect::Null(), pixels, 4 * 4); sprite.SetBlendMode(SDL_BLENDMODE_BLEND); render.SetDrawBlendMode(SDL_BLENDMODE_BLEND); while (1) { - // Process events + // Process input SDL_Event event; - while (SDL_PollEvent(&event)) { - if (event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)) + while (SDL_PollEvent(&event)) + if (event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && (event.key.keysym.sym == SDLK_ESCAPE || event.key.keysym.sym == SDLK_q))) return 0; - } - // Render - render.SetDrawColor(0, 0, 0); + // Clear screen + render.SetDrawColor(0, 32, 32); render.Clear(); - // Render lines - render.SetDrawColor(255, 0, 0); - render.DrawLine(10, 10, 630, 10); - render.SetDrawColor(0, 255, 0); - render.DrawLine(630, 10, 630, 470); - render.SetDrawColor(0, 0, 255); - render.DrawLine(630, 470, 10, 470); - render.SetDrawColor(255, 255, 255); - render.DrawLine(10, 470, 10, 10); + // Simple copy + render.Copy(sprite, Rect::Null(), Rect(80, 0, 240, 240)); - render.SetDrawColor(255, 255, 255, 127); - render.FillRect(0, 0, 20, 20); - render.SetDrawColor(255, 255, 255); - render.DrawRect(0, 0, 20, 20); + // Copy with modulation + render.Copy(sprite, Rect::Null(), Rect(400, 0, 120, 120)); + sprite.SetAlphaMod(92); + render.Copy(sprite, Rect::Null(), Rect(400 + 120, 0, 120, 120)); + sprite.SetColorMod(255, 0, 0); + render.Copy(sprite, Rect::Null(), Rect(400, 0 + 120, 120, 120)); + sprite.SetAlphaMod(); + render.Copy(sprite, Rect::Null(), Rect(400 + 120, 0 + 120, 120, 120)); + sprite.SetColorMod(); - // Pixel-perfectness test - render.SetDrawColor(192, 192, 192); - render.DrawLine(6, 2, 6, 10); - render.DrawLine(2, 6, 10, 6); + // Copy with rotation + render.Copy(sprite, Rect::Null(), Rect(80, 240, 240, 240), -1.0 * SDL_GetTicks() / 5000.0 * 360.0, Point::Null(), SDL_FLIP_NONE); - render.SetDrawColor(255, 255, 255); - render.DrawRect(5, 5, 7, 7); - render.DrawRect(3, 3, 9, 9); - - // Render 4 smaller squares - sprite.SetAlphaMod(0xff); - render.Copy(sprite, Rect::Null(), Rect(80, 0, 240, 240), SDL_GetTicks() / 5000.0 * 360.0, Point::Null(), SDL_FLIP_NONE); - render.Copy(sprite, Rect::Null(), Rect(80, 360, 240, 240), -1.0 * SDL_GetTicks() / 5000.0 * 360.0, Point::Null(), SDL_FLIP_NONE); - render.Copy(sprite, Rect::Null(), Rect(400, 0, 240, 240), -1.0 * SDL_GetTicks() / 5000.0 * 360.0, Point::Null(), SDL_FLIP_NONE); - render.Copy(sprite, Rect::Null(), Rect(400, 360, 240, 240), SDL_GetTicks() / 5000.0 * 360.0, Point::Null(), SDL_FLIP_NONE); - - // Render transparent bigger square - sprite.SetAlphaMod(0x80); - render.Copy(sprite, Rect::Null(), Rect(80, 0, 480, 480), SDL_GetTicks() / 10000.0 * 360.0, Point::Null(), SDL_FLIP_NONE); + // Rotation around another point + render.Copy(sprite, Rect::Null(), Rect(520, 360, 120, 120), -1.0 * SDL_GetTicks() / 5000.0 * 360.0, Point(0, 0), SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); render.Present();