#pragma once #include #include #include #include class Tetromino { public: enum TetrominoId : uint8_t { o_piece, s_piece, z_piece, t_piece, l_piece, j_piece, i_piece, tetromino_id_count, tetromino_id_none, }; enum TetrominoRotation { rotate_clockwise = 1, rotate_counter_clockwise = 3 }; enum TetrominoDirection { left = -1, right = 1 }; public: Tetromino() = delete; Tetromino(Board &board); Tetromino(uint16_t *board_bitmap); TetrominoId GetId(); BoardPos GetPos(); int32_t GetOri(); void GetBitmap(uint16_t *bitmap); bool IsCollisionWithBoard(); // for last tetromino to check game over bool MaybeMoveDown(); void MaybeMoveHorizontally(TetrominoDirection direction); void MaybeRotate(TetrominoRotation rotation); void Draw(RenderGroup &render_group) const; public: static bool IsCollisionWithBoard(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *board_bitmap); static void GetBitmap(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *bitmap); static Color GetColor(TetrominoId id); static void Draw(TetrominoId id, int32_t ori, V2F32 pos, float scale, RenderGroup &render_group); private: static TetrominoId GetRandomId(); private: TetrominoId m_Id; BoardPos m_Pos; int32_t m_Ori; uint16_t *m_BoardBitmap; };