Implement line clearing
This commit is contained in:
parent
f80003520e
commit
41bd08f25c
43
tetris.c
43
tetris.c
@ -93,6 +93,48 @@ void zero_piece_mask(){
|
||||
}
|
||||
}
|
||||
|
||||
void bool_array_fill(bool* target, int len, bool val){
|
||||
for(int i = 0; i < len; i++){
|
||||
target[i] = val;
|
||||
}
|
||||
}
|
||||
|
||||
void get_filled_lines(bool* target){
|
||||
bool_array_fill(target, BOARD_HEIGHT, 0);
|
||||
bool filled_line_array[BOARD_WIDTH] = {[0 ... BOARD_WIDTH-1] = 1};
|
||||
// loop over board lines
|
||||
for(int iter_y = 0; iter_y < BOARD_HEIGHT; iter_y++){
|
||||
if(memcmp(board_mask[iter_y], filled_line_array, sizeof(bool)*BOARD_WIDTH) == 0){
|
||||
target[iter_y] = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void clear_lines(){
|
||||
bool filled_lines[BOARD_HEIGHT] = {0};
|
||||
get_filled_lines(filled_lines);
|
||||
int offset_lines = 0; // count the offset we need to keep when checking the rest of the lines
|
||||
for(int line = BOARD_HEIGHT - 1; line > 0; line--){
|
||||
|
||||
int hitline = line+offset_lines;
|
||||
if(!filled_lines[line]) // The line we are iterating over is not filled
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// shift all lines down one starting at hitline
|
||||
for(int shift_line = hitline; shift_line > 0; shift_line--){
|
||||
for(int iter_x = 0; iter_x < BOARD_WIDTH; iter_x++){
|
||||
board[shift_line][iter_x] = board[shift_line-1][iter_x];
|
||||
board_mask[shift_line][iter_x] = board_mask[shift_line-1][iter_x];
|
||||
}
|
||||
}
|
||||
// All the lines are now shifted down (moved to higher index) so we need to start shifting offset by +1 now.
|
||||
offset_lines++;
|
||||
}
|
||||
}
|
||||
|
||||
void populate_board_mask(){
|
||||
for(int i = 0; i < BOARD_HEIGHT; i++){
|
||||
for(int j = 0; j < BOARD_WIDTH; j++){
|
||||
@ -399,6 +441,7 @@ void game_tick(){
|
||||
place_piece();
|
||||
zero_piece_mask();
|
||||
populate_board_mask();
|
||||
clear_lines();
|
||||
spawn_piece();
|
||||
}
|
||||
|
||||
|
||||
3
tetris.h
3
tetris.h
@ -161,6 +161,9 @@ void game_tick();
|
||||
void debugDraw(int x, int y, Color color);
|
||||
void debug_draw_blocks(Vector2 block_vecs[], Color color);
|
||||
void debug_draw_blocks_on_axis(Vector2 block_vecs[], Color color);
|
||||
void bool_array_fill(bool* target, int len, bool val);
|
||||
void get_filled_lines(bool* target);
|
||||
void clear_lines();
|
||||
void draw();
|
||||
void update();
|
||||
void init_game();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user