Visualine reachable scanline

Also tweak logic for lowest point
scene_man
En Yi 2023-07-20 22:51:15 +08:00
parent dc20a6b992
commit 34655d5c0a
2 changed files with 29 additions and 5 deletions

View File

@ -117,14 +117,19 @@ void update_water_runner_system(Scene_t* scene)
bool to_go[4] = {false, false, false, false};
Tile_t* curr_tile = tilemap.tiles + curr_idx;
if (curr_height > curr_low && curr_tile->water_level < tilemap.max_water_level)
unsigned int next = curr_idx + p_crunner->bfs_tilemap.width;
Tile_t* next_tile = tilemap.tiles + next;
if (
curr_height > curr_low
&& curr_tile->water_level < tilemap.max_water_level
&& next_tile->water_level < tilemap.max_water_level
)
{
lowest_tile = curr_idx;
}
unsigned int next = curr_idx + p_crunner->bfs_tilemap.width;
Tile_t* next_tile = tilemap.tiles + next;
if (next < p_crunner->bfs_tilemap.len)
{
to_go[0] = next_tile->solid != SOLID;
@ -136,9 +141,9 @@ void update_water_runner_system(Scene_t* scene)
|| curr_tile->water_level == tilemap.max_water_level
)
{
next = curr_idx - 1;
if (next % p_crunner->bfs_tilemap.width != 0)
if (curr_idx % p_crunner->bfs_tilemap.width != 0)
{
next = curr_idx - 1;
next_tile = tilemap.tiles + next;
to_go[1] = next_tile->solid != SOLID;
}

View File

@ -109,6 +109,25 @@ static void level_scene_render_func(Scene_t* scene)
next_idx = p_runner->bfs_tilemap.tilemap[curr_idx].to;
}
}
else if (p_runner->state == SCANLINE_FILL)
{
unsigned int tile_y = ((p_runner->current_tile) / tilemap.width);
for (size_t i = 0; i < tilemap.width; ++i)
{
unsigned int tile_idx = i + tile_y * tilemap.width;
if (
p_runner->bfs_tilemap.tilemap[tile_idx].reachable
&& tilemap.tiles[tile_idx].water_level < tilemap.max_water_level
)
{
DrawRectangle(
i * tilemap.tile_size, tile_y * tilemap.tile_size,
tilemap.tile_size, tilemap.tile_size, ColorAlpha(GREEN, 0.4)
);
}
}
}
}
char buffer[64] = {0};