Refactor out level loading function

scene_man
En Yi 2023-08-14 15:03:11 +08:00
parent 8e9efc622d
commit 9387189927
2 changed files with 48 additions and 60 deletions

View File

@ -190,19 +190,6 @@ static void level_scene_render_func(Scene_t* scene)
EndDrawing();
}
static inline unsigned int get_tile_idx(int x, int y, const TileGrid_t* tilemap)
{
unsigned int tile_x = x / TILE_SIZE;
unsigned int tile_y = y / TILE_SIZE;
if (tile_x < tilemap->width && tile_y < tilemap->height)
{
return tile_y * tilemap->width + tile_x;
}
return MAX_N_TILES;
}
static void simple_friction_system(Scene_t* scene)
{
CMovementState_t* p_mstate;
@ -290,48 +277,7 @@ int main(void)
scene.data.level_pack = pack;
scene.data.current_level = 0;
scene.data.tilemap.width = scene.data.level_pack->levels[scene.data.current_level].width;
scene.data.tilemap.height = scene.data.level_pack->levels[scene.data.current_level].height;
scene.data.tilemap.n_tiles = scene.data.tilemap.width * scene.data.tilemap.height;
assert(scene.data.tilemap.n_tiles <= MAX_N_TILES);
memset(scene.data.tile_sprites, 0, sizeof(scene.data.tile_sprites));
LevelMap_t lvl_map = scene.data.level_pack->levels[scene.data.current_level];
// Level loading in here
for (size_t i = 0; i < scene.data.tilemap.n_tiles;i++)
{
all_tiles[i].max_water_level = 4;
all_tiles[i].solid = NOT_SOLID;
all_tiles[i].tile_type = EMPTY_TILE;
all_tiles[i].moveable = true;
all_tiles[i].size = (Vector2){TILE_SIZE, TILE_SIZE};
switch (lvl_map.tiles[i].tile_type)
{
case 1:
change_a_tile(&scene.data.tilemap, i, SOLID_TILE);
break;
case 2:
all_tiles[i].water_level = all_tiles[i].max_water_level;
break;
default:
break;
}
switch (lvl_map.tiles[i].entity_to_spawn)
{
case 1:
{
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;
}
break;
default:
break;
}
}
assert(load_level_tilemap(&scene, 0) == true);
update_entity_manager(&scene.scene.ent_manager);
@ -356,7 +302,6 @@ int main(void)
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

@ -1,4 +1,5 @@
#include "scene_impl.h"
#include "ent_impl.h"
#include "constants.h"
void init_level_scene_data(LevelSceneData_t* data, uint32_t max_tiles, Tile_t* tiles)
@ -44,17 +45,59 @@ void term_level_scene_data(LevelSceneData_t* data)
UnloadRenderTexture(data->game_viewport); // Unload render texture
}
static void clear_level_tilemap(LevelSceneData_t* data)
{
}
bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num)
{
if (level_num >= scene->data.level_pack->n_levels) return false;
LevelMap_t lvl_map = scene->data.level_pack->levels[level_num];
uint32_t n_tiles = lvl_map.width * lvl_map.height;
if (n_tiles > scene->data.tilemap.max_tiles) return false;
scene->data.current_level = level_num;
scene->data.tilemap.width = lvl_map.width;
scene->data.tilemap.height = lvl_map.height;
scene->data.tilemap.n_tiles = n_tiles;
clear_entity_manager(&scene->scene.ent_manager);
for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++)
{
scene->data.tilemap.tiles[i].max_water_level = 4;
scene->data.tilemap.tiles[i].solid = NOT_SOLID;
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};
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;
}
switch (lvl_map.tiles[i].entity_to_spawn)
{
case 1:
{
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;
}
break;
default:
break;
}
}
return true;
}
void reload_level_tilemap(LevelScene_t* scene)
{
load_level_tilemap(scene, scene->data.current_level);
}
void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type)