Updated scene manager into a stack
This commit is contained in:
+41
-17
@@ -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
|
||||||
// ------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user