diff --git a/.gitignore b/.gitignore index 75041ec..6b11f20 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -./src/tetris-clone \ No newline at end of file +tetris-clone \ No newline at end of file diff --git a/src/app.c b/src/app.c index 5a2e176..21510a6 100644 --- a/src/app.c +++ b/src/app.c @@ -1,65 +1,69 @@ #include -#include "raylib.h" +#include "app.h" #include "manager.h" +#include "raylib.h" #include "renderer.h" #include "tetromino.h" -#include "app.h" #define TARGET_FPS 60 void a_run(void) { - _a_initialize(); - _a_loop(); - _a_cleanup(); + _a_initialize(); + _a_loop(); + _a_cleanup(); } void _a_initialize(void) { - _a_initialize_raylib(); - m_initialize(); - r_initialize(); - _a_gameboard_clear(); + _a_initialize_raylib(); + m_initialize(); + r_initialize(); + _a_gameboard_clear(); } void _a_initialize_raylib(void) { - InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Tetris Clone"); - SetTargetFPS(TARGET_FPS); + InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Tetris Clone"); + SetTargetFPS(TARGET_FPS); } void _a_gameboard_clear(void) { - m_blocks_set_empty(); - int number_blocks_updated = 0; - struct TetrominoBlock** blocks_updated = m_blocks_get_updated(&number_blocks_updated); - r_render_blocks(blocks_updated, number_blocks_updated); + m_blocks_set_empty(); + int number_blocks_updated = 0; + struct TetrominoBlock **blocks_updated = + m_blocks_get_updated(&number_blocks_updated); + r_render_blocks(blocks_updated, number_blocks_updated); } void _a_loop(void) { - int tick_rate = 0; // Guaranteed a better way to do this XD - while(!WindowShouldClose()) { - while(m_tetromino_can_spawn()) { - _a_input_process(); - if (tick_rate == 0) { - m_update(); - tick_rate = 50; - } - int number_blocks_updated = 0; - struct TetrominoBlock** blocks_updated = GetUpdatedBlocks(&number_blocks_updated); - r_render_blocks(blocks_updated, number_blocks_updated); - tick_rate--; - } - r_render_game_over(0); + int tick_rate = 0; // Guaranteed a better way to do this XD + while (!WindowShouldClose()) { + while (m_tetromino_can_spawn()) { + if (WindowShouldClose()) + return; + _a_input_process(); + if (tick_rate == 0) { + m_update(); + tick_rate = 50; + } + int number_blocks_updated = 0; + struct TetrominoBlock **blocks_updated = + m_blocks_get_updated(&number_blocks_updated); + r_render_blocks(blocks_updated, number_blocks_updated); + tick_rate--; } + r_render_game_over(0); + } } void _a_input_process(void) { - if (IsKeyPressed(KEY_SPACE)) { - m_request_falling_tetromino_rotate(); - } - if (IsKeyDown(KEY_A)) { - m_request_falling_tetromino_move_left(); - } else if (IsKeyDown(KEY_D)) { - m_request_falling_tetromino_move_right(); - } + if (IsKeyPressed(KEY_SPACE)) { + m_request_falling_tetromino_rotate(); + } + if (IsKeyDown(KEY_A)) { + m_request_falling_tetromino_move_left(); + } else if (IsKeyDown(KEY_D)) { + m_request_falling_tetromino_move_right(); + } } void _a_cleanup() { diff --git a/src/main.c b/src/main.c index 22038ff..7952e2e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,7 @@ #include "app.h" int main(void) { - a_run(); + a_run(); - return 0; + return 0; } diff --git a/src/manager.c b/src/manager.c index 0344d1f..86722d9 100644 --- a/src/manager.c +++ b/src/manager.c @@ -1,5 +1,5 @@ #include //srand,rand, -#include //time +#include //time #define __USE_MISC #include //cos,sin @@ -11,33 +11,55 @@ // should probably call these offsets struct Offset { - int xOffset; - int yOffset; + int xOffset; + int yOffset; }; struct Point { - int x; - int y; + int x; + int y; }; struct Tetromino { - enum TetrominoType type; - struct TetrominoBlock* blocks[BLOCKS_WITHIN_A_TETROMINO]; + enum TetrominoType type; + struct TetrominoBlock *blocks[BLOCKS_WITHIN_A_TETROMINO]; }; +struct TetrominoBlock *_m_block_at_point(struct Point point); +void _m_blocks_updated_register_block(struct TetrominoBlock *pTetrominoBlock); +void _m_blocks_alloc(void); +void _m_blocks_updated_erase(void); +void _m_blocks_spawn_at_offset_from_spawn_point(enum TetrominoType type, + struct Offset *offsets); +void _m_tetromino_spawn(void); +enum TetrominoType _m_tetromino_type_random(void); +void _m_block_set_type(struct TetrominoBlock *pTetrominoBlock, + enum TetrominoType type); +void _m_falling_tetromino_rotate(void); +bool _m_falling_tetromino_can_move_right(void); +void _m_falling_tetromino_translate(struct Offset offset); +bool _m_point_intersects_static_block(struct Point point); +bool _m_block_can_fall(struct TetrominoBlock block); +bool _m_falling_tetromino_can_fall(void); +void _m_falling_tetromino_fall(void); +bool _m_block_can_move_left(struct TetrominoBlock block); +bool _m_falling_tetromino_can_move_left(void); +bool _m_block_can_move_right(struct TetrominoBlock block); + // To find block (x,y) index = (x % FIELD_WIDTH) + (y * FIELD_WIDTH) -// Height doesn't matter but height is just the factor of how tall the board is. -// And in the end each row is just the next representation of width * units, height just determines row count. -// Doesn't factor into determining X,Y -struct TetrominoBlock* _blocks[FIELD_HEIGHT * FIELD_WIDTH]; -struct TetrominoBlock* _blocks_updated[FIELD_HEIGHT * FIELD_WIDTH] = { NULL }; +// Height doesn't matter but height is just the factor of how tall the board +// is. And in the end each row is just the next representation of width * +// units, height just determines row count. Doesn't factor into determining +// X,Y +struct TetrominoBlock *_blocks[FIELD_HEIGHT * FIELD_WIDTH]; +struct TetrominoBlock *_blocks_updated[FIELD_HEIGHT * FIELD_WIDTH] = {NULL}; int _blocks_updated_length = 0; bool _should_spawn_tetromino; struct Tetromino fallingTetromino; const char kSpawnX = FIELD_WIDTH / 2 - 1; -const struct Offset kShiftDownOffset = { .xOffset = 0, .yOffset = 1 }; -const struct Offset kShiftLeftOffset = { .xOffset = -1, .yOffset = 0 }; -const struct Offset kShiftRightOffset = { .xOffset = 1, .yOffset = 0 }; +const struct Offset kShiftDownOffset = {.xOffset = 0, .yOffset = 1}; +const struct Offset kShiftLeftOffset = {.xOffset = -1, .yOffset = 0}; +const struct Offset kShiftRightOffset = {.xOffset = 1, .yOffset = 0}; bool _should_tetromino_move_left = false; bool _should_tetromino_move_right = false; @@ -45,343 +67,343 @@ bool _should_tetromino_rotate = false; bool _tetromino_can_spawn = true; void m_initialize(void) { - _m_blocks_alloc(); - _should_spawn_tetromino = true; + _m_blocks_alloc(); + _should_spawn_tetromino = true; } void m_update(void) { - _m_blocks_updated_erase(); - if (_should_spawn_tetromino) { - _should_tetromino_move_left = false; - _should_tetromino_move_right = false; - _m_tetromino_spawn(); - _should_spawn_tetromino = false; - } else { - // TODO move left and right refactor naming + _m_blocks_updated_erase(); + if (_should_spawn_tetromino) { + _should_tetromino_move_left = false; + _should_tetromino_move_right = false; + _m_tetromino_spawn(); + _should_spawn_tetromino = false; + } else { + // TODO move left and right refactor naming - if(_should_tetromino_rotate) { - _m_falling_tetromino_rotate(); - _should_tetromino_rotate = false; - } - - if (_should_tetromino_move_right && _m_falling_tetromino_can_move_right()) { - _m_falling_tetromino_translate(kShiftRightOffset); - _should_tetromino_move_right = false; - } - - if (_should_tetromino_move_left && _m_falling_tetromino_can_move_left()) { - _m_falling_tetromino_translate(kShiftLeftOffset); - _should_tetromino_move_left = false; - } - - _m_falling_tetromino_fall(); + if (_should_tetromino_rotate) { + _m_falling_tetromino_rotate(); + _should_tetromino_rotate = false; } + + if (_should_tetromino_move_right && _m_falling_tetromino_can_move_right()) { + _m_falling_tetromino_translate(kShiftRightOffset); + _should_tetromino_move_right = false; + } + + if (_should_tetromino_move_left && _m_falling_tetromino_can_move_left()) { + _m_falling_tetromino_translate(kShiftLeftOffset); + _should_tetromino_move_left = false; + } + + _m_falling_tetromino_fall(); + } } void m_blocks_set_empty(void) { - for (int i = 0; i < FIELD_HEIGHT * FIELD_WIDTH; i++) { - _m_block_set_type(_blocks[i], TT_EMPTY); - } + for (int i = 0; i < FIELD_HEIGHT * FIELD_WIDTH; i++) { + _m_block_set_type(_blocks[i], TT_EMPTY); + } } -bool m_tetromino_can_spawn(void) { - return _tetromino_can_spawn; -} +bool m_tetromino_can_spawn(void) { return _tetromino_can_spawn; } void m_request_falling_tetromino_rotate(void) { - _should_tetromino_rotate = true; + _should_tetromino_rotate = true; } void m_request_falling_tetromino_move_left(void) { - _should_tetromino_move_left = true; - _should_tetromino_move_right = false; + _should_tetromino_move_left = true; + _should_tetromino_move_right = false; } void m_request_falling_tetromino_move_right(void) { - _should_tetromino_move_right = true; - _should_tetromino_move_left = false; + _should_tetromino_move_right = true; + _should_tetromino_move_left = false; } -struct TetrominoBlock** m_blocks_get_updated(int* numberOfUpdatedBlocks) { - *numberOfUpdatedBlocks = _blocks_updated_length; +struct TetrominoBlock **m_blocks_get_updated(int *numberOfUpdatedBlocks) { + *numberOfUpdatedBlocks = _blocks_updated_length; - return &_blocks_updated[0]; + return &_blocks_updated[0]; } void m_deactivate(void) { - for(int i = 0; i < sizeof(_blocks) / sizeof(struct TetrominoBlock*); i++) { - free(_blocks[i]); - } + for (int i = 0; i < sizeof(_blocks) / sizeof(struct TetrominoBlock *); i++) { + free(_blocks[i]); + } } void _m_blocks_alloc(void) { - for (int i = 0; i < FIELD_HEIGHT * FIELD_WIDTH; i++) { - struct TetrominoBlock* block = calloc(1, sizeof(struct TetrominoBlock)); - block->x = i % FIELD_WIDTH; - block->y = i / FIELD_WIDTH; + for (int i = 0; i < FIELD_HEIGHT * FIELD_WIDTH; i++) { + struct TetrominoBlock *block = calloc(1, sizeof(struct TetrominoBlock)); + block->x = i % FIELD_WIDTH; + block->y = i / FIELD_WIDTH; - _blocks[i] = block; - } + _blocks[i] = block; + } } -void _m_blocks_updated_erase() { - _blocks_updated_length = 0; -} +void _m_blocks_updated_erase() { _blocks_updated_length = 0; } void _m_tetromino_spawn() { - enum TetrominoType type = _m_tetromino_type_get_random(); + enum TetrominoType type = _m_tetromino_type_random(); - struct Offset offsets[BLOCKS_WITHIN_A_TETROMINO]; + struct Offset offsets[BLOCKS_WITHIN_A_TETROMINO]; - if (type == TT_O) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 0; + if (type == TT_O) { + offsets[0].xOffset = 0; + offsets[0].yOffset = 0; - offsets[1].xOffset = 1; - offsets[1].yOffset = 0; + offsets[1].xOffset = 1; + offsets[1].yOffset = 0; - offsets[2].xOffset = 0; - offsets[2].yOffset = 1; + offsets[2].xOffset = 0; + offsets[2].yOffset = 1; - offsets[3].xOffset = 1; - offsets[3].yOffset = 1; - } else if (type == TT_J) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 0; + offsets[3].xOffset = 1; + offsets[3].yOffset = 1; + } else if (type == TT_J) { + offsets[0].xOffset = 0; + offsets[0].yOffset = 0; - offsets[1].xOffset = 0; - offsets[1].yOffset = 1; + offsets[1].xOffset = 0; + offsets[1].yOffset = 1; - offsets[2].xOffset = 1; - offsets[2].yOffset = 1; + offsets[2].xOffset = 1; + offsets[2].yOffset = 1; - offsets[3].xOffset = 2; - offsets[3].yOffset = 1; - } else if (type == TT_L) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 1; + offsets[3].xOffset = 2; + offsets[3].yOffset = 1; + } else if (type == TT_L) { + offsets[0].xOffset = 0; + offsets[0].yOffset = 1; - offsets[1].xOffset = 1; - offsets[1].yOffset = 1; + offsets[1].xOffset = 1; + offsets[1].yOffset = 1; - offsets[2].xOffset = 2; - offsets[2].yOffset = 1; + offsets[2].xOffset = 2; + offsets[2].yOffset = 1; - offsets[3].xOffset = 2; - offsets[3].yOffset = 0; - } else if (type == TT_I) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 0; + offsets[3].xOffset = 2; + offsets[3].yOffset = 0; + } else if (type == TT_I) { + offsets[0].xOffset = 0; + offsets[0].yOffset = 0; - offsets[1].xOffset = 0; - offsets[1].yOffset = 1; + offsets[1].xOffset = 0; + offsets[1].yOffset = 1; - offsets[2].xOffset = 0; - offsets[2].yOffset = 2; + offsets[2].xOffset = 0; + offsets[2].yOffset = 2; - offsets[3].xOffset = 0; - offsets[3].yOffset = 3; - } else if (type == TT_S) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 1; + offsets[3].xOffset = 0; + offsets[3].yOffset = 3; + } else if (type == TT_S) { + offsets[0].xOffset = 0; + offsets[0].yOffset = 1; - offsets[1].xOffset = 1; - offsets[1].yOffset = 1; + offsets[1].xOffset = 1; + offsets[1].yOffset = 1; - offsets[2].xOffset = 1; - offsets[2].yOffset = 0; + offsets[2].xOffset = 1; + offsets[2].yOffset = 0; - offsets[3].xOffset = 2; - offsets[3].yOffset = 0; - } else if (type == TT_Z) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 0; + offsets[3].xOffset = 2; + offsets[3].yOffset = 0; + } else if (type == TT_Z) { + offsets[0].xOffset = 0; + offsets[0].yOffset = 0; - offsets[1].xOffset = 1; - offsets[1].yOffset = 0; + offsets[1].xOffset = 1; + offsets[1].yOffset = 0; - offsets[2].xOffset = 1; - offsets[2].yOffset = 1; + offsets[2].xOffset = 1; + offsets[2].yOffset = 1; - offsets[3].xOffset = 2; - offsets[3].yOffset = 1; - } else if (type == TT_T) { - offsets[0].xOffset = 1; - offsets[0].yOffset = 0; + offsets[3].xOffset = 2; + offsets[3].yOffset = 1; + } else if (type == TT_T) { + offsets[0].xOffset = 1; + offsets[0].yOffset = 0; - offsets[1].xOffset = 0; - offsets[1].yOffset = 1; + offsets[1].xOffset = 0; + offsets[1].yOffset = 1; - offsets[2].xOffset = 1; - offsets[2].yOffset = 1; + offsets[2].xOffset = 1; + offsets[2].yOffset = 1; - offsets[3].xOffset = 2; - offsets[3].yOffset = 1; - } + offsets[3].xOffset = 2; + offsets[3].yOffset = 1; + } - _m_blocks_spawn_at_offset_from_spawn_point(type, offsets); + _m_blocks_spawn_at_offset_from_spawn_point(type, offsets); } enum TetrominoType _m_tetromino_type_random(void) { - srand(time(NULL)); - return (enum TetrominoType) rand() % 6; + srand(time(NULL)); + return (enum TetrominoType)rand() % 6; } -void _m_blocks_spawn_at_offset_from_spawn_point(enum TetrominoType type, struct Offset *offsets) { - fallingTetromino.type = type; - int index = 0; - while(index < BLOCKS_WITHIN_A_TETROMINO) { - struct Point spawnPoint; - spawnPoint.x = kSpawnX + offsets->xOffset; - spawnPoint.y = offsets->yOffset; +void _m_blocks_spawn_at_offset_from_spawn_point(enum TetrominoType type, + struct Offset *offsets) { + fallingTetromino.type = type; + int index = 0; + while (index < BLOCKS_WITHIN_A_TETROMINO) { + struct Point spawnPoint; + spawnPoint.x = kSpawnX + offsets->xOffset; + spawnPoint.y = offsets->yOffset; - struct TetrominoBlock* spawnBlock = _m_block_at_point(spawnPoint); - if (spawnBlock->type != TT_EMPTY) { - _tetromino_can_spawn = false; - return; - } - _m_block_set_type(spawnBlock, type); + struct TetrominoBlock *spawnBlock = _m_block_at_point(spawnPoint); + if (spawnBlock->type != TT_EMPTY) { + _tetromino_can_spawn = false; + return; + } + _m_block_set_type(spawnBlock, type); - // I'm not sure if this makes more sense to be here or return a list of spawnedBlocks to be handled in Parent function - fallingTetromino.blocks[index] = spawnBlock; + // I'm not sure if this makes more sense to be here or return a list of + // spawnedBlocks to be handled in Parent function + fallingTetromino.blocks[index] = spawnBlock; - index++; - offsets++; - } + index++; + offsets++; + } } struct TetrominoBlock *_m_block_at_point(struct Point point) { - return _blocks[(point.x % FIELD_WIDTH) + (point.y * FIELD_WIDTH)]; + return _blocks[(point.x % FIELD_WIDTH) + (point.y * FIELD_WIDTH)]; } -void _m_block_set_type(struct TetrominoBlock *pTetrominoBlock, enum TetrominoType type) { - pTetrominoBlock->type = type; - _m_blocks_updated_register_block(pTetrominoBlock); +void _m_block_set_type(struct TetrominoBlock *pTetrominoBlock, + enum TetrominoType type) { + pTetrominoBlock->type = type; + _m_blocks_updated_register_block(pTetrominoBlock); } void _m_blocks_updated_register_block(struct TetrominoBlock *pTetrominoBlock) { - if (_blocks_updated_length < FIELD_HEIGHT * FIELD_WIDTH) { - _blocks_updated[_blocks_updated_length] = pTetrominoBlock; - _blocks_updated_length++; - } + if (_blocks_updated_length < FIELD_HEIGHT * FIELD_WIDTH) { + _blocks_updated[_blocks_updated_length] = pTetrominoBlock; + _blocks_updated_length++; + } } void _m_falling_tetromino_rotate(void) { - if (fallingTetromino.type != TT_O) { - // i'm not a fan of this implementation - // check this out instead and re-write - // https://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array?page=1&tab=scoredesc#tab-top - - } + if (fallingTetromino.type != TT_O) { + // i'm not a fan of this implementation + // check this out instead and re-write + // https://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array?page=1&tab=scoredesc#tab-top + } } bool _m_falling_tetromino_can_move_right(void) { - bool result = true; - for(int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - if (!_m_block_can_move_right(*(fallingTetromino.blocks[i]))) { - result = false; - break; - } + bool result = true; + for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { + if (!_m_block_can_move_right(*(fallingTetromino.blocks[i]))) { + result = false; + break; } + } - return result; + return result; } void _m_falling_tetromino_translate(struct Offset offset) { - for(int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - _m_block_set_type(fallingTetromino.blocks[i], TT_EMPTY); - _m_blocks_updated_register_block(fallingTetromino.blocks[i]); - } + for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { + _m_block_set_type(fallingTetromino.blocks[i], TT_EMPTY); + _m_blocks_updated_register_block(fallingTetromino.blocks[i]); + } - for(int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - struct Point updatedPoint = { .x = fallingTetromino.blocks[i]->x + offset.xOffset, .y = fallingTetromino.blocks[i]->y + offset.yOffset}; - fallingTetromino.blocks[i] = _m_block_at_point(updatedPoint); + for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { + struct Point updatedPoint = { + .x = fallingTetromino.blocks[i]->x + offset.xOffset, + .y = fallingTetromino.blocks[i]->y + offset.yOffset}; + fallingTetromino.blocks[i] = _m_block_at_point(updatedPoint); - _m_block_set_type(fallingTetromino.blocks[i], fallingTetromino.type); - _m_blocks_updated_register_block(fallingTetromino.blocks[i]); - } + _m_block_set_type(fallingTetromino.blocks[i], fallingTetromino.type); + _m_blocks_updated_register_block(fallingTetromino.blocks[i]); + } } bool _m_point_intersects_static_block(struct Point point) { - bool result = false; + bool result = false; - struct TetrominoBlock* blockAtPoint = _m_block_at_point(point); + struct TetrominoBlock *blockAtPoint = _m_block_at_point(point); - if (blockAtPoint->type != TT_EMPTY) { - result = true; + if (blockAtPoint->type != TT_EMPTY) { + result = true; - for(int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - if (fallingTetromino.blocks[i] == blockAtPoint) { - result = false; - break; - } - } + for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { + if (fallingTetromino.blocks[i] == blockAtPoint) { + result = false; + break; + } } + } - return result; + return result; } bool _m_block_can_fall(struct TetrominoBlock block) { - struct Point newBlockPoint = { .x = block.x, .y = block.y + 1}; - if (newBlockPoint.y >= FIELD_HEIGHT) { - return false; - } else if (_m_point_intersects_static_block(newBlockPoint)) { - return false; - } else { - return true; - } + struct Point newBlockPoint = {.x = block.x, .y = block.y + 1}; + if (newBlockPoint.y >= FIELD_HEIGHT) { + return false; + } else if (_m_point_intersects_static_block(newBlockPoint)) { + return false; + } else { + return true; + } } bool _m_falling_tetromino_can_fall(void) { - bool result = true; - for(int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - if (!_m_block_can_fall(*(fallingTetromino.blocks[i]))) { - result = false; - break; - } + bool result = true; + for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { + if (!_m_block_can_fall(*(fallingTetromino.blocks[i]))) { + result = false; + break; } + } - return result; + return result; } void _m_falling_tetromino_fall(void) { - if(_m_falling_tetromino_can_fall()) { - _m_falling_tetromino_translate(kShiftDownOffset); - } else { - _should_spawn_tetromino = true; - } + if (_m_falling_tetromino_can_fall()) { + _m_falling_tetromino_translate(kShiftDownOffset); + } else { + _should_spawn_tetromino = true; + } } bool _m_block_can_move_left(struct TetrominoBlock block) { - struct Point newBlockPoint = { .x = block.x - 1, .y = block.y }; - if (newBlockPoint.x < 0) { - return false; - } else if (_m_point_intersects_static_block(newBlockPoint)) { - return false; - } else { - return true; - } + struct Point newBlockPoint = {.x = block.x - 1, .y = block.y}; + if (newBlockPoint.x < 0) { + return false; + } else if (_m_point_intersects_static_block(newBlockPoint)) { + return false; + } else { + return true; + } } bool _m_falling_tetromino_can_move_left(void) { - bool result = true; - for(int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - if (!_m_block_can_move_left(*(fallingTetromino.blocks[i]))) { - result = false; - break; - } + bool result = true; + for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { + if (!_m_block_can_move_left(*(fallingTetromino.blocks[i]))) { + result = false; + break; } + } - return result; + return result; } bool _m_block_can_move_right(struct TetrominoBlock block) { - struct Point newBlockPoint = { .x = block.x + 1, .y = block.y }; - if (newBlockPoint.x >= FIELD_WIDTH) { - return false; - } else if (_m_point_intersects_static_block(newBlockPoint)) { - return false; - } else { - return true; - } + struct Point newBlockPoint = {.x = block.x + 1, .y = block.y}; + if (newBlockPoint.x >= FIELD_WIDTH) { + return false; + } else if (_m_point_intersects_static_block(newBlockPoint)) { + return false; + } else { + return true; + } } diff --git a/src/manager.h b/src/manager.h index bc4ecea..afa1df7 100644 --- a/src/manager.h +++ b/src/manager.h @@ -12,7 +12,7 @@ bool m_tetromino_can_spawn(void); // Bad name + Doesn't follow naming void m_request_falling_tetromino_rotate(void); void m_request_falling_tetromino_move_left(void); void m_request_falling_tetromino_move_right(void); -struct TetrominoBlock* *m_blocks_get_updated(int* lengthOfBlocksUpdated); +struct TetrominoBlock **m_blocks_get_updated(int *lengthOfBlocksUpdated); void m_deactivate(void); #endif diff --git a/src/renderer.c b/src/renderer.c index d23fda9..002e066 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -13,57 +13,61 @@ Texture2D _orange_texture; Texture2D _empty_texture; void r_initialize(void) { - _yellow_texture = LoadTexture(RES_PNG_FILE(yellow)); - _blue_texture = LoadTexture(RES_PNG_FILE(blue)); - _light_blue_texture = LoadTexture(RES_PNG_FILE(light-blue)); - _red_texture = LoadTexture(RES_PNG_FILE(red)); - _purple_texture = LoadTexture(RES_PNG_FILE(purple)); - _green_texture = LoadTexture(RES_PNG_FILE(green)); - _orange_texture = LoadTexture(RES_PNG_FILE(orange)); - _empty_texture = LoadTexture(RES_PNG_FILE(black)); + _yellow_texture = LoadTexture(RES_PNG_FILE(yellow)); + _blue_texture = LoadTexture(RES_PNG_FILE(blue)); + _light_blue_texture = LoadTexture(RES_PNG_FILE(light - blue)); + _red_texture = LoadTexture(RES_PNG_FILE(red)); + _purple_texture = LoadTexture(RES_PNG_FILE(purple)); + _green_texture = LoadTexture(RES_PNG_FILE(green)); + _orange_texture = LoadTexture(RES_PNG_FILE(orange)); + _empty_texture = LoadTexture(RES_PNG_FILE(black)); } -void r_render_blocks(struct TetrominoBlock* *blocks, int length) { - BeginDrawing(); - while(length--) { - _r_render_block(*(*blocks)); - blocks++; - } - EndDrawing(); +void r_render_blocks(struct TetrominoBlock **blocks, int length) { + BeginDrawing(); + while (length--) { + _r_render_block(*(*blocks)); + blocks++; + } + EndDrawing(); } void r_render_game_over(int score) { - BeginDrawing(); - ClearBackground(BLACK); - DrawText("Game Over", SCREEN_WIDTH / 2 - MeasureText("Game Over", 24) / 2, 200, 24, RED); - char* score_message = TextFormat("Score: %d", score); - DrawText(score_message, SCREEN_WIDTH / 2 - MeasureText(score_message, 18) / 2, 232, 18, RED); - // Draw a play again button - EndDrawing(); + BeginDrawing(); + ClearBackground(BLACK); + DrawText("Game Over", SCREEN_WIDTH / 2 - MeasureText("Game Over", 24) / 2, + 200, 24, RED); + char *score_message = TextFormat("Score: %d", score); + DrawText(score_message, SCREEN_WIDTH / 2 - MeasureText(score_message, 18) / 2, + 232, 18, RED); + // Draw a play again button + EndDrawing(); } void _r_render_block(struct TetrominoBlock blockToRender) { - Texture2D* textureToRender = _r_get_texture_by_tetromino_type(blockToRender.type); - DrawTexture(*textureToRender, blockToRender.x * TEXTURE_SIZE, blockToRender.y * TEXTURE_SIZE, WHITE); + Texture2D *textureToRender = + _r_get_texture_by_tetromino_type(blockToRender.type); + DrawTexture(*textureToRender, blockToRender.x * TEXTURE_SIZE, + blockToRender.y * TEXTURE_SIZE, WHITE); } -Texture2D* _r_get_texture_by_tetromino_type(enum TetrominoType type) { - switch (type) { - case TT_O: - return &_yellow_texture; - case TT_I: - return &_light_blue_texture; - case TT_T: - return &_purple_texture; - case TT_J: - return &_blue_texture; - case TT_L: - return &_orange_texture; - case TT_S: - return &_green_texture; - case TT_Z: - return &_red_texture; - default: - return &_empty_texture; - } +Texture2D *_r_get_texture_by_tetromino_type(enum TetrominoType type) { + switch (type) { + case TT_O: + return &_yellow_texture; + case TT_I: + return &_light_blue_texture; + case TT_T: + return &_purple_texture; + case TT_J: + return &_blue_texture; + case TT_L: + return &_orange_texture; + case TT_S: + return &_green_texture; + case TT_Z: + return &_red_texture; + default: + return &_empty_texture; + } } \ No newline at end of file diff --git a/src/renderer.h b/src/renderer.h index 63c9f69..bde2a31 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -8,7 +8,7 @@ #define SCREEN_WIDTH 320 void r_initialize(void); -void r_render_blocks(struct TetrominoBlock* *blocks, int length); +void r_render_blocks(struct TetrominoBlock **blocks, int length); void r_render_game_over(int score); void _r_render_block(struct TetrominoBlock blockToRender); diff --git a/src/tetris-clone b/src/tetris-clone deleted file mode 100755 index bdebff7..0000000 Binary files a/src/tetris-clone and /dev/null differ diff --git a/src/tetromino.h b/src/tetromino.h index 2904f26..154e5b0 100644 --- a/src/tetromino.h +++ b/src/tetromino.h @@ -1,16 +1,7 @@ #ifndef TETRIS_CLONE_TETROMINO_H_ #define TETRIS_CLONE_TETROMINO_H_ -enum TetrominoType { - TT_I, - TT_J, - TT_L, - TT_O, - TT_S, - TT_T, - TT_Z, - TT_EMPTY -}; +enum TetrominoType { TT_I, TT_J, TT_L, TT_O, TT_S, TT_T, TT_Z, TT_EMPTY }; struct TetrominoBlock { unsigned int x;