From 2933f5bdd83017c0c76f52521fca7450fbc8e366 Mon Sep 17 00:00:00 2001 From: Quinn Date: Sun, 19 Jan 2025 21:05:31 +0100 Subject: [PATCH] add colour --- src/game/game.h | 6 ++++-- src/main.c | 4 ++-- src/window/renderer.c | 29 +++++++++++++++++++++-------- src/window/renderer.h | 16 +++++++++++++++- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/game/game.h b/src/game/game.h index f6c9358..1a5e7f9 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -1,7 +1,8 @@ #pragma once #include -typedef Uint16 Shape; +typedef uint16_t Shape; +typedef uint16_t Row; // 0 1 2 3 #define TETROMINO_I ((Shape)0b1000100010001000) // 1000 1000 1000 1000 the I tetromino with no rotation @@ -26,8 +27,9 @@ typedef Uint16 Shape; // stores the data used in the game #define ROWS 32 +#define COLUMNS (sizeof(Row) * 8 / 3) typedef struct { - Uint16 row[ROWS]; + Row row[ROWS]; } GameData; // updates the game's state diff --git a/src/main.c b/src/main.c index 7aa067c..6684535 100644 --- a/src/main.c +++ b/src/main.c @@ -7,7 +7,7 @@ #include "errors.h" #include "game/game.h" -#include "window/audio.h" +// #include "window/audio.h" #include "window/renderer.h" #ifdef __EMSCRIPTEN__ // for web builds @@ -37,7 +37,7 @@ static void init(void) { } // initialize audio - AudioDevice* audio_device = audio_device_init(32000, AUDIO_S16, 1, 4096); + // AudioDevice* audio_device = audio_device_init(32000, AUDIO_S16, 1, 4096); // AudioData audio1 = audio_load_wav(audio_device, "FILE MANE"); } diff --git a/src/window/renderer.c b/src/window/renderer.c index 1145bae..ca65d90 100644 --- a/src/window/renderer.c +++ b/src/window/renderer.c @@ -5,7 +5,7 @@ #include #include "../errors.h" -#include "../main.h" +#include "SDL_render.h" int renderer_init(SDL_Window** window, SDL_Renderer** renderer) { @@ -26,6 +26,16 @@ int renderer_init(SDL_Window** window, SDL_Renderer** renderer) { return 0; } +static inline int set_block(SDL_Renderer* renderer, const Row row, const uint8_t block, const uint8_t filter, const uint8_t x, const uint8_t y) { + uint8_t colour = block & filter; + return SDL_SetRenderDrawColor(renderer, + 0xFF * (0 != (colour & (RED | RED << 3))), + 0xFF * (0 != (colour & (GREEN | GREEN << 3))), + 0xFF * (0 != (colour & (BLUE | BLUE << 3))), + 0xFF) | + SDL_RenderFillRect(renderer, &(SDL_Rect){x * BLOCK_WIDTH + 1, y * BLOCK_HEIGHT + 1, BLOCK_WIDTH - 1, BLOCK_HEIGHT - 1}); +} + void renderer_update(const RenderData* render_data) { SDL_Renderer* renderer = render_data->renderer; GameData* data = render_data->game_data; @@ -36,14 +46,17 @@ void renderer_update(const RenderData* render_data) { success |= SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x50); success |= SDL_RenderClear(renderer); - SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); - for (int y = 0; y < ROWS; y++) { - Uint16 row = data->row[y]; + for (uint8_t y = 0; y < ROWS; y++) { + Row row = data->row[y]; - for (int x = 16; x >= 0; x--) { - if ((row & (1 << x)) != 0) { - success |= SDL_RenderFillRect(renderer, &(SDL_Rect){x * BLOCK_WIDTH + 1, y * BLOCK_HEIGHT + 1, BLOCK_WIDTH - 1, BLOCK_HEIGHT - 1}); - } + for (uint8_t x = 0; x < COLUMNS; x += 2) { + uint8_t block = row >> (x * 3); // get the two blocks stored at this column + + if ((block & 0x0F) != 0) + success |= set_block(renderer, row, block, 0x0F, x + 1, y); + + if ((block & 0xF0) != 0) + success |= set_block(renderer, row, block, 0xF0, x, y); } } diff --git a/src/window/renderer.h b/src/window/renderer.h index cc646a8..164198c 100644 --- a/src/window/renderer.h +++ b/src/window/renderer.h @@ -1,12 +1,26 @@ #pragma once #include + #include "../game/game.h" #define SCREEN_WIDTH 256 #define SCREEN_HEIGHT (SCREEN_WIDTH * 2) -#define BLOCK_WIDTH (SCREEN_WIDTH / 16) +#define BLOCK_WIDTH (SCREEN_WIDTH / COLUMNS) #define BLOCK_HEIGHT (SCREEN_HEIGHT / (BLOCK_WIDTH * 2)) +// fits colours in a 3 bit length +// 4th bit is unused +typedef enum { + BLACK = 0, + RED = 1, + GREEN = 2, + BLUE = 4, + YELLOW = RED | GREEN, + CYAN = GREEN | BLUE, + MAGENTA = BLUE | RED, + WHITE = RED | GREEN | BLUE, +} Colour; + typedef struct { SDL_Window* window; SDL_Renderer* renderer;