Updated scene manager into a stack

This commit is contained in:
2026-09-21 07:29:24 +02:00
parent 179a3fa91b
commit 5791f14db8
+41 -17
View File
@@ -1,5 +1,6 @@
package game package game
import "core:fmt"
import rl "vendor:raylib" import rl "vendor:raylib"
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
@@ -20,27 +21,29 @@ Scene :: struct {
winner_is_player: bool, winner_is_player: bool,
} }
// ------------------------------------------------------------------------------ push_scene :: proc(game: ^Game, scene: Scene) {
// Unified Scene Dispatchers append(&game.scene_stack, scene)
// ------------------------------------------------------------------------------ }
scene_render :: proc(scene: ^Scene) {
if level, ok := scene.level.?; ok {
render_level(level)
render_hud(level)
}
#partial switch scene.type { pop_scene :: proc(game: ^Game) {
case .Pause_Menu: if len(game.scene_stack) > 1 {
render_pause_menu(scene^) pop(&game.scene_stack)
case .Settings_Menu:
render_settings_menu(scene^)
case .Game_Over:
render_game_over(scene^)
case .Main_Menu:
render_main_menu(scene^)
} }
} }
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) { scene_update :: proc(scene: ^Scene, game: ^Game, input: Input_Event, dt: f32) {
#partial switch scene.type { #partial switch scene.type {
case .Main_Menu: case .Main_Menu:
@@ -52,6 +55,9 @@ scene_update :: proc(scene: ^Scene, game: ^Game, input: Input_Event, dt: f32) {
case .Settings_Menu: case .Settings_Menu:
update_settings_menu(scene, input) update_settings_menu(scene, input)
case .Game_Over:
update_game_over(scene, input)
case .Gameplay: case .Gameplay:
level, level_ok := &scene.level.? level, level_ok := &scene.level.?
assert(level_ok, "scene_update: .Gameplay scene is missing a Level component") 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) 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 // UI Definitions
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------