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