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;
}
}
switch (action)
if (!pressed)
{
case ACTION_RESTART:
puts("Restarting!");
break;
default:
break;
switch (action)
{
case ACTION_RESTART:
reload_level_tilemap((LevelScene_t*)scene);
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_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_DOWN, ACTION_DOWN);
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_P, ACTION_METAL_TOGGLE);
while(true)
{

View File

@ -62,11 +62,14 @@ with open(converted_filename, 'wb+') as out_file:
level_layout = {}
entity_layout = {}
water_layout = {}
for layer in level['layerInstances']:
if layer["__identifier"] == "Tiles":
level_layout = layer
elif layer["__identifier"] == "Entities":
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
width = level_layout["__cWid"]
@ -79,6 +82,9 @@ with open(converted_filename, 'wb+') as out_file:
for tile in level_layout["gridTiles"]:
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"]:
if ent["__identifier"] in ENTID_MAPPING:
x,y = ent["__grid"]

View File

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

View File

@ -17,7 +17,8 @@ typedef struct LevelTileInfo
{
uint8_t tile_type;
uint8_t entity_to_spawn;
uint8_t dummy[2];
uint8_t water;
uint8_t dummy[1];
}LevelTileInfo_t;
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 term_level_scene_data(LevelSceneData_t* data);
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);
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].moveable = true;
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)
{
case 1:
change_a_tile(&scene->data.tilemap, i, SOLID_TILE);
break;
case 2:
scene->data.tilemap.tiles[i].water_level = scene->data.tilemap.tiles[i].max_water_level;
break;
default:
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);
CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T);
p_ct->position.x = i & scene->data.tilemap.width;
p_ct->position.y = 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) * scene->data.tilemap.tile_size;
}
break;
default:
break;
}
scene->data.tilemap.tiles[i].water_level = lvl_map.tiles[i].water;
}
return true;
}
@ -100,6 +99,26 @@ void reload_level_tilemap(LevelScene_t* scene)
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)
{
TileType_t last_type = tilemap->tiles[tile_idx].tile_type;