Add level switching

Changelog:
- Water is now on a separate layer in LDtk
- Update water loading in assets functions
- Add actions to switch levels
scene_man
En Yi 2023-08-14 17:05:43 +08:00
parent ca392a0efd
commit e0ea01a4de
6 changed files with 53 additions and 13 deletions

View File

@ -229,13 +229,22 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
break; break;
} }
} }
switch (action) if (!pressed)
{ {
case ACTION_RESTART: switch (action)
puts("Restarting!"); {
break; case ACTION_RESTART:
default: reload_level_tilemap((LevelScene_t*)scene);
break; break;
case ACTION_NEXTLEVEL:
load_next_level_tilemap((LevelScene_t*)scene);
break;
case ACTION_PREVLEVEL:
load_prev_level_tilemap((LevelScene_t*)scene);
break;
default:
break;
}
} }
} }
@ -293,11 +302,12 @@ int main(void)
sc_map_put_64(&scene.scene.action_map, KEY_R, ACTION_RESTART); sc_map_put_64(&scene.scene.action_map, KEY_R, ACTION_RESTART);
sc_map_put_64(&scene.scene.action_map, KEY_RIGHT_BRACKET, ACTION_NEXTLEVEL);
sc_map_put_64(&scene.scene.action_map, KEY_LEFT_BRACKET, ACTION_PREVLEVEL);
sc_map_put_64(&scene.scene.action_map, KEY_UP, ACTION_UP); sc_map_put_64(&scene.scene.action_map, KEY_UP, ACTION_UP);
sc_map_put_64(&scene.scene.action_map, KEY_DOWN, ACTION_DOWN); sc_map_put_64(&scene.scene.action_map, KEY_DOWN, ACTION_DOWN);
sc_map_put_64(&scene.scene.action_map, KEY_LEFT, ACTION_LEFT); sc_map_put_64(&scene.scene.action_map, KEY_LEFT, ACTION_LEFT);
sc_map_put_64(&scene.scene.action_map, KEY_RIGHT, ACTION_RIGHT); sc_map_put_64(&scene.scene.action_map, KEY_RIGHT, ACTION_RIGHT);
sc_map_put_64(&scene.scene.action_map, KEY_P, ACTION_METAL_TOGGLE);
while(true) while(true)
{ {

View File

@ -62,11 +62,14 @@ with open(converted_filename, 'wb+') as out_file:
level_layout = {} level_layout = {}
entity_layout = {} entity_layout = {}
water_layout = {}
for layer in level['layerInstances']: for layer in level['layerInstances']:
if layer["__identifier"] == "Tiles": if layer["__identifier"] == "Tiles":
level_layout = layer level_layout = layer
elif layer["__identifier"] == "Entities": elif layer["__identifier"] == "Entities":
entity_layout = layer entity_layout = layer
elif layer["__identifier"] == "Water":
water_layout = layer
# Dimensions of each level is obtained via __cWid and __cHei. Get the __gridSize as well # Dimensions of each level is obtained via __cWid and __cHei. Get the __gridSize as well
width = level_layout["__cWid"] width = level_layout["__cWid"]
@ -79,6 +82,9 @@ with open(converted_filename, 'wb+') as out_file:
for tile in level_layout["gridTiles"]: for tile in level_layout["gridTiles"]:
tiles_info[tile["d"][0]][0] = ids_tiletype_map[tile["t"]] tiles_info[tile["d"][0]][0] = ids_tiletype_map[tile["t"]]
for i, water_level in enumerate(water_layout["intGridCsv"]):
tiles_info[i][2] = water_level
for ent in entity_layout["entityInstances"]: for ent in entity_layout["entityInstances"]:
if ent["__identifier"] in ENTID_MAPPING: if ent["__identifier"] in ENTID_MAPPING:
x,y = ent["__grid"] x,y = ent["__grid"]

View File

@ -13,5 +13,7 @@ typedef enum ActionType
ACTION_CONFIRM, ACTION_CONFIRM,
ACTION_EXIT, ACTION_EXIT,
ACTION_RESTART, ACTION_RESTART,
ACTION_NEXTLEVEL,
ACTION_PREVLEVEL,
}ActionType_t; }ActionType_t;
#endif // __ACTIONS_H #endif // __ACTIONS_H

View File

@ -17,7 +17,8 @@ typedef struct LevelTileInfo
{ {
uint8_t tile_type; uint8_t tile_type;
uint8_t entity_to_spawn; uint8_t entity_to_spawn;
uint8_t dummy[2]; uint8_t water;
uint8_t dummy[1];
}LevelTileInfo_t; }LevelTileInfo_t;
typedef struct LevelMap typedef struct LevelMap

View File

@ -39,6 +39,8 @@ void free_sandbox_scene(LevelScene_t* scene);
void init_level_scene_data(LevelSceneData_t* data, uint32_t max_tiles, Tile_t* tiles); void init_level_scene_data(LevelSceneData_t* data, uint32_t max_tiles, Tile_t* tiles);
void term_level_scene_data(LevelSceneData_t* data); void term_level_scene_data(LevelSceneData_t* data);
void reload_level_tilemap(LevelScene_t* scene); void reload_level_tilemap(LevelScene_t* scene);
void load_next_level_tilemap(LevelScene_t* scene);
void load_prev_level_tilemap(LevelScene_t* scene);
bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num); bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num);
void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type); void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type);

View File

@ -66,15 +66,13 @@ bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num)
scene->data.tilemap.tiles[i].tile_type = EMPTY_TILE; scene->data.tilemap.tiles[i].tile_type = EMPTY_TILE;
scene->data.tilemap.tiles[i].moveable = true; scene->data.tilemap.tiles[i].moveable = true;
scene->data.tilemap.tiles[i].size = (Vector2){TILE_SIZE, TILE_SIZE}; scene->data.tilemap.tiles[i].size = (Vector2){TILE_SIZE, TILE_SIZE};
sc_map_clear_64v(&scene->data.tilemap.tiles[i].entities_set);
switch (lvl_map.tiles[i].tile_type) switch (lvl_map.tiles[i].tile_type)
{ {
case 1: case 1:
change_a_tile(&scene->data.tilemap, i, SOLID_TILE); change_a_tile(&scene->data.tilemap, i, SOLID_TILE);
break; break;
case 2:
scene->data.tilemap.tiles[i].water_level = scene->data.tilemap.tiles[i].max_water_level;
break;
default: default:
break; break;
} }
@ -84,13 +82,14 @@ bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num)
{ {
Entity_t* ent = create_player(&scene->scene.ent_manager, &scene->scene.engine->assets); Entity_t* ent = create_player(&scene->scene.ent_manager, &scene->scene.engine->assets);
CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T); CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T);
p_ct->position.x = i & scene->data.tilemap.width; p_ct->position.x = (i % scene->data.tilemap.width) * scene->data.tilemap.tile_size;
p_ct->position.y = i / scene->data.tilemap.width; p_ct->position.y = (i / scene->data.tilemap.width) * scene->data.tilemap.tile_size;
} }
break; break;
default: default:
break; break;
} }
scene->data.tilemap.tiles[i].water_level = lvl_map.tiles[i].water;
} }
return true; return true;
} }
@ -100,6 +99,26 @@ void reload_level_tilemap(LevelScene_t* scene)
load_level_tilemap(scene, scene->data.current_level); load_level_tilemap(scene, scene->data.current_level);
} }
void load_next_level_tilemap(LevelScene_t* scene)
{
unsigned int lvl = scene->data.current_level;
lvl++;
if (lvl < scene->data.level_pack->n_levels)
{
load_level_tilemap(scene, lvl);
}
}
void load_prev_level_tilemap(LevelScene_t* scene)
{
unsigned int lvl = scene->data.current_level;
lvl--;
if (lvl >= 0)
{
load_level_tilemap(scene, lvl);
}
}
void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type) void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type)
{ {
TileType_t last_type = tilemap->tiles[tile_idx].tile_type; TileType_t last_type = tilemap->tiles[tile_idx].tile_type;