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);
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);

View File

@ -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)
{

View File

@ -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;

View File

@ -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;

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].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
{