From 13668b36b1513da0cf035ef25a1e3c6b8b920a9b Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Wed, 30 Oct 2019 14:00:39 -0400 Subject: improve skins --- frontends/sdl/cetris_sdl.c | 87 ++++++++++++++++++++++++++++------------------ frontends/sdl/cetris_sdl.h | 6 ++-- 2 files changed, 57 insertions(+), 36 deletions(-) (limited to 'frontends') diff --git a/frontends/sdl/cetris_sdl.c b/frontends/sdl/cetris_sdl.c index 66d4667..cc202cc 100644 --- a/frontends/sdl/cetris_sdl.c +++ b/frontends/sdl/cetris_sdl.c @@ -43,22 +43,16 @@ void setup_sdl(cetris_ui *ui) { IMG_Init(IMG_INIT_PNG); - ui->skin.clear_sound = (audio_clip_t *)malloc(sizeof(audio_clip_t) * ui->skin.clear_sound_count); - for (int i = 0; i < ui->skin.clear_sound_count; i++) { - char name[25]; - format_str(name, 25, "data/bclear_%i.wav", i); + SDL_AudioSpec spec; - SDL_LoadWAV(name, &ui->skin.clear_sound[i].wav_spec, - &ui->skin.clear_sound[i].wav_buffer, &ui->skin.clear_sound[i].wav_length); - } - - SDL_LoadWAV("data/lock.wav", &ui->skin.lock_sound.wav_spec, - &ui->skin.lock_sound.wav_buffer, &ui->skin.lock_sound.wav_length); - - SDL_LoadWAV("data/tetris.wav", &ui->skin.tetris_sound.wav_spec, - &ui->skin.tetris_sound.wav_buffer, &ui->skin.tetris_sound.wav_length); + SDL_memset(&spec, 0, sizeof(spec)); + spec.freq = 44100; + spec.format = AUDIO_S16; + spec.channels = 2; + spec.samples = 4096; + spec.callback = NULL; - ui->audio_device = SDL_OpenAudioDevice(NULL, 0, &ui->skin.clear_sound[0].wav_spec, NULL, 0); + ui->audio_device = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0); if (ui->audio_device == 0) printf("failed to open audio device\n"); } @@ -74,6 +68,34 @@ TTF_Font* get_font(cetris_ui *ui, int size) { return ui->fonts[ui->font_count++].font; } +SDL_Texture* load_png(cetris_ui* ui, char* file) { + SDL_Surface* loaded_surface = IMG_Load(file); + return SDL_CreateTextureFromSurface(ui->render, loaded_surface); +} + +void load_skin(cetris_ui *ui) { + ui->skin.clear_sound = (audio_clip_t *)malloc(sizeof(audio_clip_t) * ui->skin.clear_sound_count); + for (int i = 0; i < ui->skin.clear_sound_count; i++) { + char name[25]; + format_str(name, 25, "data/bclear_%i.wav", i); + + SDL_LoadWAV(name, &ui->skin.clear_sound[i].wav_spec, + &ui->skin.clear_sound[i].wav_buffer, &ui->skin.clear_sound[i].wav_length); + } + + SDL_LoadWAV("data/lock.wav", &ui->skin.lock_sound.wav_spec, + &ui->skin.lock_sound.wav_buffer, &ui->skin.lock_sound.wav_length); + + SDL_LoadWAV("data/tetris.wav", &ui->skin.tetris_sound.wav_spec, + &ui->skin.tetris_sound.wav_buffer, &ui->skin.tetris_sound.wav_length); + + if (ui->skin.image_background) { + ui->skin.game_background = load_png(ui, "data/loli.png"); + SDL_SetTextureAlphaMod(ui->skin.game_background, 40); + SDL_SetTextureBlendMode(ui->skin.game_background, SDL_BLENDMODE_BLEND); + } +} + void draw_text(cetris_ui *ui, char* string, int x, int y, TTF_Font* font, SDL_Color color) { SDL_Surface *surface; surface = TTF_RenderText_Solid(font, string, color); @@ -90,11 +112,6 @@ void draw_text(cetris_ui *ui, char* string, int x, int y, TTF_Font* font, SDL_Co SDL_FreeSurface(surface); } -SDL_Texture* load_png(cetris_ui* ui, char* file) { - SDL_Surface* loaded_surface = IMG_Load(file); - return SDL_CreateTextureFromSurface(ui->render, loaded_surface); -} - void draw_image(cetris_ui *ui, SDL_Texture *i, int x, int y, int width, int height) { SDL_Rect dest = {x, y, width, height}; SDL_RenderCopy(ui->render, i, NULL, &dest); @@ -115,13 +132,17 @@ void draw_board(cetris_ui *ui, SDL_Texture *m, game_board_t* board, int x, int y SDL_RenderClear(ui->render); SDL_Rect background = {0, 0, w, h + 5}; + + if (ui->skin.image_background) { + SDL_RenderCopy(ui->render, ui->skin.game_background, NULL, &background); + } else { + SDL_SetRenderDrawColor(ui->render, + board->scheme.off.r - (int)(fmod((double)board->count_down, (double)1.0) * 50), + board->scheme.off.g, board->scheme.off.b, board->scheme.off.a); - SDL_SetRenderDrawColor(ui->render, - board->scheme.off.r - (int)(fmod((double)board->count_down, (double)1.0) * 50), - board->scheme.off.g, board->scheme.off.b, board->scheme.off.a); - - SDL_RenderFillRect(ui->render, &background); - SDL_RenderDrawRect(ui->render, &background); + SDL_RenderFillRect(ui->render, &background); + SDL_RenderDrawRect(ui->render, &background); + } SDL_SetRenderDrawColor(ui->render, board->scheme.main.r, board->scheme.main.g, board->scheme.main.b, board->scheme.main.a); @@ -342,12 +363,11 @@ void draw(cetris_ui* ui) { switch (ui->current_game) { case SOLO: - draw_image(ui, ui->solo.background, 0, 0, W, H); + //draw_image(ui, ui->solo.background, 0, 0, W, H); draw_board(ui, ui->solo.main, &ui->solo.game_board, (W / 2) - 125, (H / 2) - 250, 250, 500); draw_held_piece(ui, ui->solo.hold, &ui->solo.game_board, (W / 2) - 230, (H / 2) - 250, 100, 100); draw_piece_queue(ui, ui->solo.queue, &ui->solo.game_board, (W / 2) + 130, (H / 2) - 250, 100, 450); draw_timer(ui, &ui->solo.game_board, 20, 20); - draw_image(ui, ui->solo.game_background, (W / 2) - 125, (H / 2) - 250, 250, 500); break; } @@ -414,11 +434,7 @@ void load_solo(cetris_ui *ui) { ui->solo.main = SDL_CreateTexture(ui->render, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 251, 506); ui->solo.queue = SDL_CreateTexture(ui->render, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 100, 450); ui->solo.hold = SDL_CreateTexture(ui->render, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 100, 100); - ui->solo.background = load_png(ui, "data/background.png"); - ui->solo.game_background = load_png(ui, "data/loli.png"); - SDL_SetTextureAlphaMod(ui->solo.game_background, 40); - SDL_SetTextureBlendMode(ui->solo.game_background, SDL_BLENDMODE_BLEND); - + //ui->solo.background = load_png(ui, "data/background.png"); ui->solo.game_board.count_down = 3; init_game(&ui->solo.game_board.game, &ui->solo.game_board.conf); @@ -512,10 +528,13 @@ void handle_game_events(cetris_ui *ui, game_board_t *board) { int main(void) { cetris_ui ui; + + setup_sdl(&ui); + ui.skin.clear_sound_count = 5; ui.skin.random_audio = true; - - setup_sdl(&ui); + ui.skin.image_background = true; + load_skin(&ui); ui.current_game = SOLO; diff --git a/frontends/sdl/cetris_sdl.h b/frontends/sdl/cetris_sdl.h index b562011..49bea5d 100644 --- a/frontends/sdl/cetris_sdl.h +++ b/frontends/sdl/cetris_sdl.h @@ -44,6 +44,9 @@ typedef struct { audio_clip_t *clear_sound; audio_clip_t lock_sound; audio_clip_t tetris_sound; + + bool image_background; + SDL_Texture *game_background; } cetris_skin_t; typedef struct { @@ -58,8 +61,7 @@ typedef struct { SDL_Texture *queue; SDL_Texture *hold; - SDL_Texture *background; - SDL_Texture *game_background; + //SDL_Texture *background; game_board_t game_board; } solo_game_t; -- cgit v1.2.3-101-g0448