diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/sdl/draw.c | 30 | ||||
| -rw-r--r-- | src/sdl/draw.h | 3 | ||||
| -rw-r--r-- | src/sdl/main.c | 58 | 
3 files changed, 86 insertions, 5 deletions
| diff --git a/src/sdl/draw.c b/src/sdl/draw.c index d95e83f..e980131 100644 --- a/src/sdl/draw.c +++ b/src/sdl/draw.c @@ -11,6 +11,7 @@  #define M_2_PI (2.0 * 3.1415926)  #define BUMP_TIME 300 +#define FADE_TIME 200  static size_t  get_cell_size( @@ -297,7 +298,6 @@ draw_solve_moves_text(    draw_text(draw_ctx->renderer, draw_ctx->font, style, buf);  } -  static void  draw_bg(    draw_ctx_t * const draw_ctx @@ -320,6 +320,31 @@ draw_bg(    SDL_RenderClear(draw_ctx->renderer);  } +static void +draw_fade( +  draw_ctx_t * const draw_ctx +) { +  // check timestamp +  if (SDL_TICKS_PASSED(draw_ctx->ticks, draw_ctx->fade_ticks + FADE_TIME)) { +    return; +  } + +  // calculate alpha mod +  const Uint32 delta = (draw_ctx->ticks - draw_ctx->fade_ticks); +  const Uint8 alpha = 255 - 255.0 * delta / FADE_TIME; + +  // set alpha mod +  if (SDL_SetTextureAlphaMod(draw_ctx->fade_tex, alpha)) { +    die("SDL_TextureSetAlphaMod(): %s", SDL_GetError()); +  } +  // SDL_Log("delta = %u, alpha = %d", delta, alpha); + +  // draw texture +  if (SDL_RenderCopy(draw_ctx->renderer, draw_ctx->fade_tex, NULL, NULL)) { +    die("SDL_RenderCopy(): %s", SDL_GetError()); +  } +} +  void  draw(    draw_ctx_t * const draw_ctx @@ -340,6 +365,9 @@ draw(    draw_solve_wait_text(draw_ctx);    draw_solve_moves_text(draw_ctx); +  // draw fade overlay +  draw_fade(draw_ctx); +    // flip    SDL_RenderPresent(draw_ctx->renderer);  } diff --git a/src/sdl/draw.h b/src/sdl/draw.h index 919f362..b7e6caa 100644 --- a/src/sdl/draw.h +++ b/src/sdl/draw.h @@ -34,6 +34,9 @@ typedef struct {    game_state_t state;    solve_t *solve;    size_t solve_num_steps; + +  Uint32 fade_ticks; +  SDL_Texture *fade_tex;  } draw_ctx_t;  void draw(draw_ctx_t * const); diff --git a/src/sdl/main.c b/src/sdl/main.c index 40896e2..0d492a5 100644 --- a/src/sdl/main.c +++ b/src/sdl/main.c @@ -17,6 +17,8 @@  #include "sounds.h"  #define WINDOW_TITLE "Pablotron Sokoban" +#define WINDOW_WIDTH 800 +#define WINDOW_HEIGHT 600  static TTF_Font *  load_font( @@ -45,11 +47,34 @@ load_font(  }  static void +draw_to_fade_tex( +  draw_ctx_t * const draw_ctx +) { +  // set render target +  if (SDL_SetRenderTarget(draw_ctx->renderer, draw_ctx->fade_tex)) { +    die("SDL_SetRenderTarget(): %s", SDL_GetError()); +  } + +  // draw +  draw(draw_ctx); + +  // clear render target +  if (SDL_SetRenderTarget(draw_ctx->renderer, NULL)) { +    die("SDL_SetRenderTarget(): %s", SDL_GetError()); +  } +} + +static void  set_level(    draw_ctx_t * const draw_ctx,    sok_ctx_t * const ctx,    const size_t level_num  ) { +  if (level_num) { +    // draw current level to fade texture +    draw_to_fade_tex(draw_ctx); +  } +    // get level data    draw_ctx->level = levels_get_level(level_num); @@ -58,6 +83,11 @@ set_level(      die("Couldn't load level %d", (int) level_num);    } +  if (level_num) { +    // set fade ticks +    draw_ctx->fade_ticks = SDL_GetTicks(); +  } +    // log level title    SDL_Log(      "Loaded level \"%s: %s\" (#%d)", @@ -167,8 +197,8 @@ int main(int argc, char *argv[]) {      WINDOW_TITLE,      SDL_WINDOWPOS_UNDEFINED,      SDL_WINDOWPOS_UNDEFINED, -    800, -    600, +    WINDOW_WIDTH, +    WINDOW_HEIGHT,      SDL_WINDOW_RESIZABLE    ); @@ -198,8 +228,28 @@ int main(int argc, char *argv[]) {      .zoom       = &zoom,      .theme      = theme_get_default(),      .bump_ticks = SDL_GetTicks() - 5000, +    .fade_ticks = SDL_GetTicks() - 5000,    }; +  // create fade texture +  draw_ctx.fade_tex = SDL_CreateTexture( +    renderer, +    SDL_PIXELFORMAT_RGBA32, +    SDL_TEXTUREACCESS_TARGET, +    WINDOW_WIDTH, +    WINDOW_HEIGHT +  ); + +  // set fade texture blend mode +  if (SDL_SetTextureBlendMode(draw_ctx.fade_tex, SDL_BLENDMODE_BLEND)) { +    die("SDl_SetTextureBlendMode(): %s", SDL_GetError()); +  } + +  // check for error +  if (!draw_ctx.fade_tex) { +    die("SDL_CreateTexture(): %s", SDL_GetError()); +  } +    // set level    set_level(&draw_ctx, &ctx, level_num); @@ -259,7 +309,7 @@ int main(int argc, char *argv[]) {        case ACTION_NEXT:          if (sok_ctx_is_done(&ctx)) {            // play sound -          sound_play(sounds, ASSET_SOUND_JUMP_0_WAV); +          sound_play(sounds, ASSET_SOUND_POWERUP_1_WAV);            // advance level            level_num++; @@ -285,7 +335,7 @@ int main(int argc, char *argv[]) {        case ACTION_WARP:          if (warp_buf_get(&warp_buf, &level_num)) {            // play sound -          sound_play(sounds, ASSET_SOUND_JUMP_0_WAV); +          sound_play(sounds, ASSET_SOUND_POWERUP_1_WAV);            // load level            set_level(&draw_ctx, &ctx, level_num); | 
