From 5791f14db835aa2d4ee202deb83535a43774f0f8 Mon Sep 17 00:00:00 2001 From: Jason Hilder Date: Mon, 21 Sep 2026 07:29:24 +0200 Subject: [PATCH] Updated scene manager into a stack --- src/scene_manager.odin | 58 +++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/src/scene_manager.odin b/src/scene_manager.odin index 1bac368..3331601 100644 --- a/src/scene_manager.odin +++ b/src/scene_manager.odin @@ -1,5 +1,6 @@ package game +import "core:fmt" import rl "vendor:raylib" // ------------------------------------------------------------------------------ @@ -20,27 +21,29 @@ Scene :: struct { winner_is_player: bool, } -// ------------------------------------------------------------------------------ -// Unified Scene Dispatchers -// ------------------------------------------------------------------------------ -scene_render :: proc(scene: ^Scene) { - if level, ok := scene.level.?; ok { - render_level(level) - render_hud(level) - } +push_scene :: proc(game: ^Game, scene: Scene) { + append(&game.scene_stack, scene) +} - #partial switch scene.type { - case .Pause_Menu: - render_pause_menu(scene^) - case .Settings_Menu: - render_settings_menu(scene^) - case .Game_Over: - render_game_over(scene^) - case .Main_Menu: - render_main_menu(scene^) +pop_scene :: proc(game: ^Game) { + if len(game.scene_stack) > 1 { + pop(&game.scene_stack) } } +set_root_scene :: proc(game: ^Game, root_scene: Scene) { + clear(&game.scene_stack) + append(&game.scene_stack, root_scene) +} + +get_active_scene :: proc(game: ^Game) -> ^Scene { + if len(game.scene_stack) == 0 do return nil + return &game.scene_stack[len(game.scene_stack) - 1] +} + +// ------------------------------------------------------------------------------ +// Unified Scene Dispatchers +// ------------------------------------------------------------------------------ scene_update :: proc(scene: ^Scene, game: ^Game, input: Input_Event, dt: f32) { #partial switch scene.type { case .Main_Menu: @@ -52,6 +55,9 @@ scene_update :: proc(scene: ^Scene, game: ^Game, input: Input_Event, dt: f32) { case .Settings_Menu: update_settings_menu(scene, input) + case .Game_Over: + update_game_over(scene, input) + case .Gameplay: level, level_ok := &scene.level.? assert(level_ok, "scene_update: .Gameplay scene is missing a Level component") @@ -69,6 +75,24 @@ scene_update :: proc(scene: ^Scene, game: ^Game, input: Input_Event, dt: f32) { process_events(game) } +scene_render :: proc(scene: ^Scene) { + if level, ok := scene.level.?; ok { + render_level(level) + render_hud(level) + } + + #partial switch scene.type { + case .Pause_Menu: + render_pause_menu(scene^) + case .Settings_Menu: + render_settings_menu(scene^) + case .Game_Over: + render_game_over(scene^) + case .Main_Menu: + render_main_menu(scene^) + } +} + // ------------------------------------------------------------------------------ // UI Definitions // ------------------------------------------------------------------------------