From 280b84ed9122d6b96555498d8672b5de98286c46 Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Mon, 14 Jan 2019 12:44:32 -0500 Subject: add bg-style.[hc] --- meson.build | 1 + src/sdl/bg-style.c | 21 +++++++++++++++ src/sdl/bg-style.h | 21 +++++++++++++++ src/sdl/draw.c | 79 +++++++++++++++++++++++++++++++++++------------------- 4 files changed, 95 insertions(+), 27 deletions(-) create mode 100644 src/sdl/bg-style.c create mode 100644 src/sdl/bg-style.h diff --git a/meson.build b/meson.build index 226054c..efaffe4 100644 --- a/meson.build +++ b/meson.build @@ -28,6 +28,7 @@ executable('sok-sdl', sources + [ 'src/sdl/action.c', 'src/sdl/sprites.c', 'src/sdl/draw-text.c', + 'src/sdl/bg-style.c', 'src/sdl/draw.c', 'src/sdl/main.c', ], dependencies: [ diff --git a/src/sdl/bg-style.c b/src/sdl/bg-style.c new file mode 100644 index 0000000..02bc759 --- /dev/null +++ b/src/sdl/bg-style.c @@ -0,0 +1,21 @@ +#include // sin() +#include "bg-style.h" + +#define M_2_PI (2.0 * 3.1415926) + +#define BG_STYLE_GET_CHANNEL(c, time) ((c).base + (((c).period) ? ( \ + (c).amplitude * sin(((c).phase + (time)) * M_2_PI / (1.0 * (c).period)) \ +) : 0)) + +SDL_Color +bg_style_get_color( + const bg_style_t * const style, + const Uint32 ticks +) { + return (SDL_Color) { + .r = BG_STYLE_GET_CHANNEL(style->r, ticks), + .g = BG_STYLE_GET_CHANNEL(style->g, ticks), + .b = BG_STYLE_GET_CHANNEL(style->b, ticks), + .a = BG_STYLE_GET_CHANNEL(style->a, ticks), + }; +} diff --git a/src/sdl/bg-style.h b/src/sdl/bg-style.h new file mode 100644 index 0000000..c4ca9a5 --- /dev/null +++ b/src/sdl/bg-style.h @@ -0,0 +1,21 @@ +#ifndef BG_STYLE_H +#define BG_STYLE_H + +#include // SDL_Color + +typedef struct { + struct { + int base, + amplitude, + phase, + period; + } r, g, b, a; +} bg_style_t; + +SDL_Color +bg_style_get_color( + const bg_style_t * const, + const Uint32 +); + +#endif /* BG_STYLE_H */ diff --git a/src/sdl/draw.c b/src/sdl/draw.c index 418ddd2..482bfb2 100644 --- a/src/sdl/draw.c +++ b/src/sdl/draw.c @@ -5,6 +5,7 @@ #include "draw.h" #include "sprites.h" #include "draw-text.h" +#include "bg-style.h" #define M_2_PI (2.0 * 3.1415926) @@ -255,7 +256,6 @@ HELP_STYLE = { }, }; -#define DELIM " " static void draw_help_text( @@ -263,55 +263,80 @@ draw_help_text( ) { // build text char buf[256]; +#define D " " snprintf( buf, sizeof(buf), - " %sU: Undo" DELIM "R: Reset" DELIM "S: Solve" DELIM "Q: Quit ", - sok_ctx_is_done(draw_ctx->ctx) ? "Space: Next Level" DELIM : "" + " %sU: Undo" D "R: Reset" D "S: Solve" D "Q: Quit ", + sok_ctx_is_done(draw_ctx->ctx) ? "Space: Next Level" D : "" ); +#undef D // draw text draw_text(draw_ctx->renderer, draw_ctx->font, &HELP_STYLE, buf); } +static const bg_style_t +BG_STYLES[] = {{ + // normal style + .r = { .base = 0x00 }, + .g = { .base = 0x00 }, + .b = { .base = 0x00 }, + .a = { .base = 0xFF }, +}, { + // won style + .r = { + .base = 0x66, + .amplitude = 0x33, + .phase = 1000, + .period = 2000, + }, + + .g = { + .base = 0x66, + .amplitude = 0x33, + .phase = 3000, + .period = 5000, + }, + + .b = { + .base = 0x66, + .amplitude = 0x33, + .phase = 5000, + .period = 7000, + }, + + .a = { + .base = 0xFF, + }, +}}; + static void -set_bg_won_color( +draw_bg( draw_ctx_t * const draw_ctx ) { - const Uint32 ticks = SDL_GetTicks(); - - // gen color - const SDL_Color c = { - .r = 0x66 + 0x33 * sinf((1000 + ticks) * M_2_PI / 2000.0), - .g = 0x66 + 0x33 * sinf((3000 + ticks) * M_2_PI / 5000.0), - .b = 0x66 + 0x33 * sinf((5000 + ticks) * M_2_PI / 7000.0), - .a = 0xFF, - }; + // get color + const SDL_Color c = bg_style_get_color( + BG_STYLES + (sok_ctx_is_done(draw_ctx->ctx) ? 1 : 0), + SDL_GetTicks() + ); // set color if (SDL_SetRenderDrawColor(draw_ctx->renderer, c.r, c.g, c.b, c.a)) { die("SDL_SetRenderDrawColor(): %s", SDL_GetError()); } + + // clear background + SDL_RenderClear(draw_ctx->renderer); } void draw( draw_ctx_t * const draw_ctx ) { - const bool is_done = sok_ctx_is_done(draw_ctx->ctx); - - // set bg color - if (sok_ctx_is_done(draw_ctx->ctx)) { - // set bg won color - set_bg_won_color(draw_ctx); - } else { - // set normal bg color - set_color(draw_ctx->renderer, is_done ? COLOR_BG_WON : COLOR_BG); - } - // clear background - SDL_RenderClear(draw_ctx->renderer); + draw_bg(draw_ctx); - // render + // render level sok_ctx_walk(draw_ctx->ctx, &DRAW_CBS, draw_ctx); // render text @@ -319,6 +344,6 @@ draw( draw_moves_text(draw_ctx); draw_help_text(draw_ctx); - // flip + // flip SDL_RenderPresent(draw_ctx->renderer); } -- cgit v1.2.3