diff --git a/scene_test.c b/scene_test.c index b6096d4..61d1f6b 100644 --- a/scene_test.c +++ b/scene_test.c @@ -34,6 +34,10 @@ int main(void) init_sandbox_scene(&scene); scene.data.tile_sprites[ONEWAY_TILE] = get_sprite(&engine.assets, "tl_owp"); scene.data.tile_sprites[LADDER] = get_sprite(&engine.assets, "tl_ldr"); + scene.data.tile_sprites[SPIKES] = get_sprite(&engine.assets, "d_spikes"); + scene.data.tile_sprites[SPIKES + TILE_90CWROT] = get_sprite(&engine.assets, "l_spikes"); + scene.data.tile_sprites[SPIKES + TILE_90CCWROT] = get_sprite(&engine.assets, "r_spikes"); + scene.data.tile_sprites[SPIKES + TILE_180ROT] = get_sprite(&engine.assets, "u_spikes"); scenes[0] = &scene.scene; change_scene(&engine, 0); diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index abba6cf..d9e93a1 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -75,9 +75,10 @@ static void level_scene_render_func(Scene_t* scene) DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, water_colour); } - if (data->tile_sprites[tilemap.tiles[i].tile_type] != NULL) + uint8_t tile_sprite_idx = tilemap.tiles[i].tile_type + tilemap.tiles[i].rotation; + if (data->tile_sprites[tile_sprite_idx] != NULL) { - draw_sprite(data->tile_sprites[tilemap.tiles[i].tile_type], (Vector2){x,y}, false); + draw_sprite(data->tile_sprites[tile_sprite_idx], (Vector2){x,y}, false); } else if (tilemap.tiles[i].tile_type == SOLID_TILE) { diff --git a/scenes/engine/collisions.h b/scenes/engine/collisions.h index 26aebc0..46d4fba 100644 --- a/scenes/engine/collisions.h +++ b/scenes/engine/collisions.h @@ -10,9 +10,18 @@ typedef enum SolidType ONE_WAY, }SolidType_t; +typedef enum TileRotation +{ + TILE_NOROTATE = 0, + TILE_90CWROT, + TILE_90CCWROT, + TILE_180ROT +}TileRotation_t; + typedef struct Tile { unsigned int tile_type; SolidType_t solid; + TileRotation_t rotation; uint8_t def; uint8_t water_level; uint8_t max_water_level; diff --git a/scenes/scene_impl.h b/scenes/scene_impl.h index 0eb9f8f..51e6248 100644 --- a/scenes/scene_impl.h +++ b/scenes/scene_impl.h @@ -19,12 +19,14 @@ typedef enum TileType { SPIKES, } TileType_t; +#define MAX_TILE_SPRITES 32 + typedef struct LevelSceneData { TileGrid_t tilemap; RenderTexture2D game_viewport; Rectangle game_rec; Camera2D cam; - Sprite_t* tile_sprites[MAX_TILE_TYPES]; + Sprite_t* tile_sprites[MAX_TILE_SPRITES]; LevelPack_t* level_pack; unsigned int current_level; }LevelSceneData_t; diff --git a/scenes/scene_systems.c b/scenes/scene_systems.c index 2c1e6c3..5ff9768 100644 --- a/scenes/scene_systems.c +++ b/scenes/scene_systems.c @@ -32,6 +32,7 @@ void init_level_scene_data(LevelSceneData_t* data, uint32_t max_tiles, Tile_t* t { data->tilemap.tiles[i].solid = NOT_SOLID; data->tilemap.tiles[i].tile_type = EMPTY_TILE; + data->tilemap.tiles[i].rotation = TILE_NOROTATE; data->tilemap.tiles[i].moveable = true; data->tilemap.tiles[i].max_water_level = 4; sc_map_init_64v(&data->tilemap.tiles[i].entities_set, 16, 0); @@ -171,6 +172,7 @@ void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_ty } + tilemap->tiles[tile_idx].rotation = TILE_NOROTATE; if (new_type == SPIKES) { // Priority: Down, Up, Left, Right @@ -183,16 +185,19 @@ void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_ty { tilemap->tiles[tile_idx].offset = (Vector2){0,0}; tilemap->tiles[tile_idx].size = (Vector2){32,16}; + tilemap->tiles[tile_idx].rotation = TILE_180ROT; } else if (tile_idx % tilemap->width != 0 && tilemap->tiles[tile_idx - 1].tile_type == SOLID_TILE) { tilemap->tiles[tile_idx].offset = (Vector2){0,0}; tilemap->tiles[tile_idx].size = (Vector2){16,32}; + tilemap->tiles[tile_idx].rotation = TILE_90CWROT; } else if ((tile_idx + 1) % tilemap->width != 0 && tilemap->tiles[tile_idx + 1].tile_type == SOLID_TILE) { tilemap->tiles[tile_idx].offset = (Vector2){16,0}; tilemap->tiles[tile_idx].size = (Vector2){16,32}; + tilemap->tiles[tile_idx].rotation = TILE_90CCWROT; } else {