Add spikes sprite support

Add tile rotation. This is kind of a temp solution, since any sprite
could use rotation. So, may need to extend this for general sprite
scene_man
En Yi 2023-08-16 21:21:55 +08:00
parent bda335fd6a
commit d3029316b7
5 changed files with 24 additions and 3 deletions

View File

@ -34,6 +34,10 @@ int main(void)
init_sandbox_scene(&scene); init_sandbox_scene(&scene);
scene.data.tile_sprites[ONEWAY_TILE] = get_sprite(&engine.assets, "tl_owp"); 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[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; scenes[0] = &scene.scene;
change_scene(&engine, 0); change_scene(&engine, 0);

View File

@ -75,9 +75,10 @@ static void level_scene_render_func(Scene_t* scene)
DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, water_colour); 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) else if (tilemap.tiles[i].tile_type == SOLID_TILE)
{ {

View File

@ -10,9 +10,18 @@ typedef enum SolidType
ONE_WAY, ONE_WAY,
}SolidType_t; }SolidType_t;
typedef enum TileRotation
{
TILE_NOROTATE = 0,
TILE_90CWROT,
TILE_90CCWROT,
TILE_180ROT
}TileRotation_t;
typedef struct Tile { typedef struct Tile {
unsigned int tile_type; unsigned int tile_type;
SolidType_t solid; SolidType_t solid;
TileRotation_t rotation;
uint8_t def; uint8_t def;
uint8_t water_level; uint8_t water_level;
uint8_t max_water_level; uint8_t max_water_level;

View File

@ -19,12 +19,14 @@ typedef enum TileType {
SPIKES, SPIKES,
} TileType_t; } TileType_t;
#define MAX_TILE_SPRITES 32
typedef struct LevelSceneData { typedef struct LevelSceneData {
TileGrid_t tilemap; TileGrid_t tilemap;
RenderTexture2D game_viewport; RenderTexture2D game_viewport;
Rectangle game_rec; Rectangle game_rec;
Camera2D cam; Camera2D cam;
Sprite_t* tile_sprites[MAX_TILE_TYPES]; Sprite_t* tile_sprites[MAX_TILE_SPRITES];
LevelPack_t* level_pack; LevelPack_t* level_pack;
unsigned int current_level; unsigned int current_level;
}LevelSceneData_t; }LevelSceneData_t;

View File

@ -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].solid = NOT_SOLID;
data->tilemap.tiles[i].tile_type = EMPTY_TILE; 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].moveable = true;
data->tilemap.tiles[i].max_water_level = 4; data->tilemap.tiles[i].max_water_level = 4;
sc_map_init_64v(&data->tilemap.tiles[i].entities_set, 16, 0); 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) if (new_type == SPIKES)
{ {
// Priority: Down, Up, Left, Right // 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].offset = (Vector2){0,0};
tilemap->tiles[tile_idx].size = (Vector2){32,16}; 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) 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].offset = (Vector2){0,0};
tilemap->tiles[tile_idx].size = (Vector2){16,32}; 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) 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].offset = (Vector2){16,0};
tilemap->tiles[tile_idx].size = (Vector2){16,32}; tilemap->tiles[tile_idx].size = (Vector2){16,32};
tilemap->tiles[tile_idx].rotation = TILE_90CCWROT;
} }
else else
{ {