diff options
Diffstat (limited to 'src/games/tetris/Tetromino.cpp')
| -rw-r--r-- | src/games/tetris/Tetromino.cpp | 100 |
1 files changed, 61 insertions, 39 deletions
diff --git a/src/games/tetris/Tetromino.cpp b/src/games/tetris/Tetromino.cpp index 9179d6d..97c8808 100644 --- a/src/games/tetris/Tetromino.cpp +++ b/src/games/tetris/Tetromino.cpp @@ -59,85 +59,101 @@ static const uint16_t s_left_aligned_bitmaps[7][4][4] = { }; -Tetromino::TetrominoId Tetromino::GetRandomId() { - static std::uniform_int_distribution<int> s_Dist(0, tetromino_id_count-1); +Tetromino::TetrominoId Tetromino::GetRandomId() +{ + static std::uniform_int_distribution<int> s_Dist(0, id_count-1); static std::mt19937 s_Rng((std::random_device()())); TetrominoId id = static_cast<TetrominoId>(s_Dist(s_Rng)); return id; } -Tetromino::Tetromino(uint16_t *board_bitmap) : - m_Id(GetRandomId()), - m_Pos{6, 20}, - m_Ori{0}, - m_BoardBitmap(board_bitmap) -{ -} -Tetromino::Tetromino(Board &board) : - Tetromino(board.m_Bitmap) +void +Tetromino::Reinit(uint16_t* board_bitmap) { + m_id = GetRandomId(); + m_pos = {6, 20}; + m_ori = {0}; + m_board_bitmap = board_bitmap; } -Tetromino::TetrominoId Tetromino::GetId() { - return m_Id; +Tetromino::TetrominoId +Tetromino::GetId() +{ + return m_id; } -BoardPos Tetromino::GetPos() { - return m_Pos; +BoardPos +Tetromino::GetPos() +{ + return m_pos; } -void Tetromino::GetBitmap(uint16_t *bitmap) { - GetBitmap(m_Id, m_Pos, m_Ori, bitmap); +void +Tetromino::GetBitmap(uint16_t* bitmap) +{ + GetBitmap(m_id, m_pos, m_ori, bitmap); } -bool Tetromino::IsCollisionWithBoard() { - bool is_collision = IsCollisionWithBoard(m_Id, m_Pos, m_Ori, m_BoardBitmap); +bool +Tetromino::IsCollisionWithBoard() +{ + bool is_collision = IsCollisionWithBoard(m_id, m_pos, m_ori, m_board_bitmap); return is_collision; } -void Tetromino::MaybeRotate(TetrominoRotation rotation) { - int32_t ori = (m_Ori + rotation) % 4; - if (!IsCollisionWithBoard(m_Id, m_Pos, ori, m_BoardBitmap)) { - m_Ori = ori; +void +Tetromino::MaybeRotate(TetrominoRotation rotation) +{ + int32_t ori = (m_ori + rotation) % 4; + if (!IsCollisionWithBoard(m_id, m_pos, ori, m_board_bitmap)) { + m_ori = ori; } } -void Tetromino::MaybeMoveHorizontally(TetrominoDirection direction) { - BoardPos pos = m_Pos; +void +Tetromino::MaybeMoveHorizontally(TetrominoDirection direction) +{ + BoardPos pos = m_pos; pos.x += static_cast<int32_t>(direction); - if (!IsCollisionWithBoard(m_Id, pos, m_Ori, m_BoardBitmap)) { - m_Pos.x = pos.x; + if (!IsCollisionWithBoard(m_id, pos, m_ori, m_board_bitmap)) { + m_pos.x = pos.x; } } -bool Tetromino::MaybeMoveDown() { - BoardPos pos = m_Pos; +bool +Tetromino::MaybeMoveDown() +{ + BoardPos pos = m_pos; pos.y -= 1; - if (!IsCollisionWithBoard(m_Id, pos, m_Ori, m_BoardBitmap)) { - m_Pos.y = pos.y; + if (!IsCollisionWithBoard(m_id, pos, m_ori, m_board_bitmap)) { + m_pos.y = pos.y; return true; } return false; } -void Tetromino::Draw() const { +void +Tetromino::Draw() +{ float world_width = 4.0f; float world_height = 3.0f; float tetromino_size_with_border = world_height / 20.0f; - float x0 = static_cast<float>(m_Pos.x - 3); - float y0 = static_cast<float>(m_Pos.y - 2); + float x0 = static_cast<float>(m_pos.x - 3); + float y0 = static_cast<float>(m_pos.y - 2); V2F32 world_pos = { ((world_width - tetromino_size_with_border*10) / 2.0f) + x0 * tetromino_size_with_border, y0 * tetromino_size_with_border }; - Tetromino::Draw(m_Id, m_Ori, world_pos, 1.0f); + Tetromino::Draw(m_id, m_ori, world_pos, 1.0f); } -bool Tetromino::IsCollisionWithBoard(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *board_bitmap) { +bool +Tetromino::IsCollisionWithBoard(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *board_bitmap) +{ uint16_t tetromino_bitmap[16]; GetBitmap(id, pos, ori, tetromino_bitmap); @@ -147,14 +163,18 @@ bool Tetromino::IsCollisionWithBoard(TetrominoId id, BoardPos pos, int32_t ori, return is_collision; } -void Tetromino::GetBitmap(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *bitmap) { +void +Tetromino::GetBitmap(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *bitmap) +{ size_t id_ = static_cast<size_t>(id); uint64_t *src = (uint64_t*)s_left_aligned_bitmaps[id_][ori]; uint64_t *dest = (uint64_t*)bitmap; *dest = *src >> pos.x; } -Color Tetromino::GetColor(TetrominoId id) { +Color +Tetromino::GetColor(TetrominoId id) +{ using enum TetrominoId; Color color; @@ -179,7 +199,9 @@ Color Tetromino::GetColor(TetrominoId id) { return color; } -void Tetromino::Draw(TetrominoId id, int32_t ori, V2F32 pos, float scale) { +void +Tetromino::Draw(TetrominoId id, int32_t ori, V2F32 pos, float scale) +{ int32_t id_ = static_cast<int32_t>(id); float world_height = 3.0f; |
