diff --git a/source/main.cpp b/source/main.cpp index 39d2f35d2b4f35fe60635aca745cf21ce08bb9b9..9d2b6b8ae20b5c02e0df1b38f8baddfbb9e0d278 100755 --- a/source/main.cpp +++ b/source/main.cpp @@ -272,6 +272,36 @@ const uint8_t PIPE_VERTICAL_SPRITE[] __attribute__ ((aligned (4))) = { 0, 1, 0, }; +/* + * this lookup table maps shapes and directions to specific sprite images + * NOTE: this table only handles shapes which have different sprites for every + * direction, which is almost all of them, but does not include Square or Pipe. + */ +MicroBitImage SPRITE_SHEET[SHAPE_TYPES_COUNT][4] = { + // FLAT_L: N, E, S, W + { + MicroBitImage((ImageData*)FLAT_L_NORTH_SPRITE), + MicroBitImage((ImageData*)FLAT_L_EAST_SPRITE), + MicroBitImage((ImageData*)FLAT_L_SOUTH_SPRITE), + MicroBitImage((ImageData*)FLAT_L_WEST_SPRITE), + }, + // TALL_L: N, E, S, W + { + MicroBitImage((ImageData*)TALL_L_NORTH_SPRITE), + MicroBitImage((ImageData*)TALL_L_EAST_SPRITE), + MicroBitImage((ImageData*)TALL_L_SOUTH_SPRITE), + MicroBitImage((ImageData*)TALL_L_WEST_SPRITE), + }, + // UPSIDE_DOWN_T: N, E, S, W + { + MicroBitImage((ImageData*)UPSIDE_DOWN_T_NORTH_SPRITE), + MicroBitImage((ImageData*)UPSIDE_DOWN_T_EAST_SPRITE), + MicroBitImage((ImageData*)UPSIDE_DOWN_T_SOUTH_SPRITE), + MicroBitImage((ImageData*)UPSIDE_DOWN_T_WEST_SPRITE), + }, +}; + + /** * @brief Stores the shape and colour information for a Block in the game. */ @@ -299,22 +329,23 @@ private: Block::Block() : shape((Shape)UBIT.random(SHAPE_TYPES_COUNT)) // choose a random shape - , facing(RotationDirection::NORTH) // for now, all shapes face North + , facing((RotationDirection)UBIT.random(4)) // choose a random direction {} MicroBitImage Block::image() const { - // NOTE: This doesn't handle rotation direction yet + // retrieve the correct image sprite switch (this->shape) { - case Shape::FLAT_L: - return MicroBitImage((ImageData*)FLAT_L_NORTH_SPRITE); - case Shape::TALL_L: - return MicroBitImage((ImageData*)TALL_L_NORTH_SPRITE); - case Shape::UPSIDE_DOWN_T: - return MicroBitImage((ImageData*)UPSIDE_DOWN_T_NORTH_SPRITE); case Shape::SQUARE: + // Squares always look the same regardless of which direction they face return MicroBitImage((ImageData*)SQUARE_SPRITE); case Shape::PIPE: - return MicroBitImage((ImageData*)PIPE_NORTH_SPRITE); + // we only need to check if it's horizontal or vertical if it's Pipe + return (this->facing % 2u) == 0u ? + MicroBitImage((ImageData*)PIPE_HORIZONTAL_SPRITE) : // North/South + MicroBitImage((ImageData*)PIPE_VERTICAL_SPRITE); // East/West + default: + // all other types (Flat L, Tall L, Upside Down T) use the lookup table + return SPRITE_SHEET[this->shape][this->facing]; } }