diff --git a/scenes/constants.h b/scenes/constants.h index 03f659f..1b3a587 100644 --- a/scenes/constants.h +++ b/scenes/constants.h @@ -5,8 +5,10 @@ #define TILE_SIZE 32 #define DEFAULT_MAP_WIDTH 48 #define DEFAULT_MAP_HEIGHT 32 -#define VIEWABLE_MAP_WIDTH 32 -#define VIEWABLE_MAP_HEIGHT 16 +#define VIEWABLE_EDITOR_MAP_WIDTH 32 +#define VIEWABLE_EDITOR_MAP_HEIGHT 16 +#define VIEWABLE_MAP_WIDTH 21 +#define VIEWABLE_MAP_HEIGHT 15 #else #define TILE_SIZE 16 #define DEFAULT_MAP_WIDTH 64 diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index 4612418..59943e0 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -1048,7 +1048,7 @@ void init_sandbox_scene(LevelScene_t* scene) scene->data.tilemap.tiles = all_tiles; init_level_scene_data( &scene->data, MAX_N_TILES, all_tiles, - (Rectangle){25, 25, VIEWABLE_MAP_WIDTH*TILE_SIZE, VIEWABLE_MAP_HEIGHT*TILE_SIZE} + (Rectangle){25, 25, VIEWABLE_EDITOR_MAP_WIDTH*TILE_SIZE, VIEWABLE_EDITOR_MAP_HEIGHT*TILE_SIZE} ); scene->data.show_grid = true; scene->data.tile_sprites[ONEWAY_TILE] = get_sprite(&scene->scene.engine->assets, "tl_owp"); diff --git a/scenes/game_scene.c b/scenes/game_scene.c index 832a751..206d9ce 100644 --- a/scenes/game_scene.c +++ b/scenes/game_scene.c @@ -9,6 +9,12 @@ #include static Tile_t all_tiles[MAX_N_TILES] = {0}; +static const uint8_t CONNECTIVITY_TILE_MAPPING[16] = { + 0,3,15,14, + 1,2,12,13, + 7,6,11,10, + 4,5,8 ,9 , +}; #define GAME_LAYER 0 #define CONTROL_LAYER 1 @@ -24,10 +30,13 @@ static void level_scene_render_func(Scene_t* scene) sc_map_foreach_value(&scene->ent_manager.entities_map[PLAYER_ENT_TAG], p_ent) { CAirTimer_t* p_air = get_component(p_ent, CAIRTIMER_T); - Vector2 air_pos = {data->game_rec.x + data->game_rec.width - 16, data->game_rec.y + data->game_rec.height - 16}; + + Sprite_t* spr = get_sprite(&scene->engine->assets, "p_bigbubble"); + Vector2 air_pos = {data->game_rec.x + data->game_rec.width - 32, data->game_rec.y + data->game_rec.height - 32}; for (uint8_t i = 0; i < p_air->curr_count; i++) { - DrawCircleV(air_pos, 16, BLUE); + draw_sprite(spr, 0, air_pos, 0, false); + //DrawCircleV(air_pos, 16, BLUE); air_pos.x -= 32; } } @@ -106,11 +115,11 @@ static void render_regular_game_scene(Scene_t* scene) TileGrid_t tilemap = data->tilemap; Entity_t* p_ent; - Vector2 min = GetScreenToWorld2D((Vector2){data->game_rec.x, data->game_rec.y}, data->camera.cam); + Vector2 min = GetScreenToWorld2D((Vector2){0, 0}, data->camera.cam); Vector2 max = GetScreenToWorld2D( (Vector2){ - data->game_rec.x + data->game_rec.width, - data->game_rec.y + data->game_rec.height + data->game_rec.width, + data->game_rec.height }, data->camera.cam ); @@ -121,8 +130,17 @@ static void render_regular_game_scene(Scene_t* scene) max.x = (int)fmin(tilemap.width, max.x + 1); max.y = (int)fmin(tilemap.height, max.y + 1); + Texture2D* bg = get_texture(&scene->engine->assets, "bg_tex"); BeginTextureMode(scene->layers.render_layers[GAME_LAYER].layer_tex); ClearBackground(WHITE); + DrawTexturePro(*bg, + //(Rectangle){0,0,64,64}, + (Rectangle){min.x,0, data->game_rec.width, data->game_rec.height}, + (Rectangle){0,0, data->game_rec.width, data->game_rec.height}, + //(Rectangle){0,0,game_rec.width, game_rec.height}, + (Vector2){0,0}, 0.0f, WHITE + ); + BeginMode2D(data->camera.cam); for (int tile_y = min.y; tile_y < max.y; tile_y++) @@ -133,61 +151,15 @@ static void render_regular_game_scene(Scene_t* scene) int x = tile_x * TILE_SIZE; int y = tile_y * TILE_SIZE; - if (data->tile_sprites[tilemap.tiles[i].tile_type] != NULL) + if (tilemap.tiles[i].tile_type == LADDER) { - draw_sprite(data->tile_sprites[tilemap.tiles[i].tile_type], 0, (Vector2){x,y}, 0.0f, false); - } - else if (tilemap.tiles[i].tile_type == SOLID_TILE) - { - DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, BLACK); - } - else if (tilemap.tiles[i].tile_type == ONEWAY_TILE) - { - DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, MAROON); - } - else if (tilemap.tiles[i].tile_type == LADDER) - { - DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, ORANGE); - } - else if (tilemap.tiles[i].tile_type == SPIKES) - { - DrawRectangle( - x + tilemap.tiles[i].offset.x, y + tilemap.tiles[i].offset.y, - tilemap.tiles[i].size.x, tilemap.tiles[i].size.y, RED - ); - } - if (tilemap.tiles[i].wet) - { -#define SURFACE_THICKNESS 4 - int up = i - tilemap.width; - unsigned int bot = i + tilemap.width; - int right = i + 1; - int left = i - 1; - int bot_line = y + TILE_SIZE - tilemap.tiles[i].water_level * WATER_BBOX_STEP - SURFACE_THICKNESS / 2; - if (up >= 0 && tilemap.tiles[up].wet) + if (data->tile_sprites[tilemap.tiles[i].tile_type] != NULL) { - DrawLineEx((Vector2){x + TILE_SIZE / 2, y}, (Vector2){x + TILE_SIZE / 2, y + TILE_SIZE - tilemap.tiles[i].water_level * WATER_BBOX_STEP}, SURFACE_THICKNESS, ColorAlpha(BLUE, 0.7)); + draw_sprite(data->tile_sprites[tilemap.tiles[i].tile_type], 0, (Vector2){x,y}, 0.0f, false); } - - - if ( - bot <= tilemap.n_tiles - && tilemap.tiles[i].water_level == 0 - ) + else { - if (i % tilemap.width != 0 && tilemap.tiles[left].wet && (tilemap.tiles[bot].solid == SOLID || tilemap.tiles[bot-1].solid == SOLID)) - { - DrawLineEx((Vector2){x, bot_line}, (Vector2){x + TILE_SIZE / 2, bot_line}, SURFACE_THICKNESS, ColorAlpha(BLUE, 0.7)); - } - if (right % tilemap.width != 0 && tilemap.tiles[right].wet && (tilemap.tiles[bot].solid == SOLID || tilemap.tiles[bot+1].solid == SOLID)) - { - DrawLineEx((Vector2){x + TILE_SIZE / 2, bot_line}, (Vector2){x + TILE_SIZE, bot_line}, SURFACE_THICKNESS, ColorAlpha(BLUE, 0.7)); - } - } - - if (tilemap.tiles[i].max_water_level < MAX_WATER_LEVEL) - { - DrawRectangleLinesEx((Rectangle){x, y, TILE_SIZE, TILE_SIZE}, 2.0, ColorAlpha(BLUE, 0.5)); + DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, ORANGE); } } } @@ -319,6 +291,78 @@ static void render_regular_game_scene(Scene_t* scene) } } + for (int tile_y = min.y; tile_y < max.y; tile_y++) + { + for (int tile_x = min.x; tile_x < max.x; tile_x++) + { + int i = tile_x + tile_y * tilemap.width; + int x = tile_x * TILE_SIZE; + int y = tile_y * TILE_SIZE; + + if (tilemap.tiles[i].tile_type != LADDER) + { + if (data->tile_sprites[tilemap.tiles[i].tile_type] != NULL) + { + draw_sprite(data->tile_sprites[tilemap.tiles[i].tile_type], 0, (Vector2){x,y}, 0.0f, false); + } + else if (tilemap.tiles[i].tile_type == SOLID_TILE) + { + DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, BLACK); + draw_sprite( + data->solid_tile_sprites, + CONNECTIVITY_TILE_MAPPING[tilemap.tiles[i].connectivity], + (Vector2){x,y}, 0.0f, false + ); + } + else if (tilemap.tiles[i].tile_type == ONEWAY_TILE) + { + DrawRectangle(x, y, TILE_SIZE, TILE_SIZE, MAROON); + } + else if (tilemap.tiles[i].tile_type == SPIKES) + { + DrawRectangle( + x + tilemap.tiles[i].offset.x, y + tilemap.tiles[i].offset.y, + tilemap.tiles[i].size.x, tilemap.tiles[i].size.y, RED + ); + } + } + if (tilemap.tiles[i].wet) + { +#define SURFACE_THICKNESS 4 + int up = i - tilemap.width; + unsigned int bot = i + tilemap.width; + int right = i + 1; + int left = i - 1; + int bot_line = y + TILE_SIZE - tilemap.tiles[i].water_level * WATER_BBOX_STEP - SURFACE_THICKNESS / 2; + if (up >= 0 && tilemap.tiles[up].wet) + { + DrawLineEx((Vector2){x + TILE_SIZE / 2, y}, (Vector2){x + TILE_SIZE / 2, y + TILE_SIZE - tilemap.tiles[i].water_level * WATER_BBOX_STEP}, SURFACE_THICKNESS, ColorAlpha(BLUE, 0.7)); + } + + + if ( + bot <= tilemap.n_tiles + && tilemap.tiles[i].water_level == 0 + ) + { + if (i % tilemap.width != 0 && tilemap.tiles[left].wet && (tilemap.tiles[bot].solid == SOLID || tilemap.tiles[bot-1].solid == SOLID)) + { + DrawLineEx((Vector2){x, bot_line}, (Vector2){x + TILE_SIZE / 2, bot_line}, SURFACE_THICKNESS, ColorAlpha(BLUE, 0.7)); + } + if (right % tilemap.width != 0 && tilemap.tiles[right].wet && (tilemap.tiles[bot].solid == SOLID || tilemap.tiles[bot+1].solid == SOLID)) + { + DrawLineEx((Vector2){x + TILE_SIZE / 2, bot_line}, (Vector2){x + TILE_SIZE, bot_line}, SURFACE_THICKNESS, ColorAlpha(BLUE, 0.7)); + } + } + + if (tilemap.tiles[i].max_water_level < MAX_WATER_LEVEL) + { + DrawRectangleLinesEx((Rectangle){x, y, TILE_SIZE, TILE_SIZE}, 2.0, ColorAlpha(BLUE, 0.5)); + } + } + } + } + sc_map_foreach_value(&scene->ent_manager.entities_map[DYNMEM_ENT_TAG], p_ent) { @@ -351,13 +395,13 @@ static void render_regular_game_scene(Scene_t* scene) } } - // Draw Border - DrawLine(0, 0, 0, tilemap.height * tilemap.tile_size, BLACK); - DrawLine(0, 0, tilemap.width * TILE_SIZE, 0, BLACK); - int val = (tilemap.width) * tilemap.tile_size; - DrawLine(val, 0, val, tilemap.height * tilemap.tile_size, BLACK); - val = (tilemap.height) * tilemap.tile_size; - DrawLine(0, val, tilemap.width * TILE_SIZE, val, BLACK); + //// Draw Border (remove later) + //DrawLine(0, 0, 0, tilemap.height * tilemap.tile_size, BLACK); + //DrawLine(0, 0, tilemap.width * TILE_SIZE, 0, BLACK); + //int val = (tilemap.width) * tilemap.tile_size; + //DrawLine(val, 0, val, tilemap.height * tilemap.tile_size, BLACK); + //val = (tilemap.height) * tilemap.tile_size; + //DrawLine(0, val, tilemap.width * TILE_SIZE, val, BLACK); EndMode2D(); EndTextureMode(); } @@ -373,7 +417,11 @@ void init_game_scene(LevelScene_t* scene) scene->data.tilemap.tiles = all_tiles; init_level_scene_data( &scene->data, MAX_N_TILES, all_tiles, - (Rectangle){25, 25, 32*TILE_SIZE, 18*TILE_SIZE} + (Rectangle){ + (scene->scene.engine->intended_window_size.x- VIEWABLE_MAP_WIDTH*TILE_SIZE) / 2.0f, + (scene->scene.engine->intended_window_size.y- VIEWABLE_MAP_HEIGHT*TILE_SIZE) / 2.0f, + VIEWABLE_MAP_WIDTH*TILE_SIZE, VIEWABLE_MAP_HEIGHT*TILE_SIZE + } ); scene->scene.bg_colour = LIGHTGRAY; @@ -394,6 +442,11 @@ void init_game_scene(LevelScene_t* scene) create_player(&scene->scene.ent_manager); update_entity_manager(&scene->scene.ent_manager); + // Set up textures + Texture2D* tex = get_texture(&scene->scene.engine->assets, "bg_tex"); + SetTextureWrap(*tex, TEXTURE_WRAP_REPEAT); + scene->data.solid_tile_sprites = get_sprite(&scene->scene.engine->assets, "stile0"); + sc_array_add(&scene->scene.systems, &update_tilemap_system); sc_array_add(&scene->scene.systems, &player_movement_input_system); sc_array_add(&scene->scene.systems, &player_bbox_update_system);