| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- -- Copyright (c) 2012-2025 Daniele Bartolini et al.
- -- SPDX-License-Identifier: MIT
- require "core/game/camera"
- GameBase = GameBase or {
- world = nil, -- Default world
- camera_unit = nil, -- Default camera
- game = nil, -- User Game
- game_level = nil,
- screen_gui = nil,
- show_help = true,
- _test_package = nil,
- }
- function GameBase.init()
- -- Create world.
- GameBase.world = Device.create_world()
- if GameBase.game and GameBase.game.init then
- GameBase.game.init()
- end
- -- Load test level if launched from Level Editor.
- if TEST then
- GameBase._test_package = Device.create_resource_package("_level_editor_test")
- ResourcePackage.load(GameBase._test_package)
- ResourcePackage.flush(GameBase._test_package)
- World.load_level(GameBase.world, "_level_editor_test")
- else
- if GameBase.game_level then
- World.load_level(GameBase.world, GameBase.game_level)
- end
- end
- -- Create default camera if it doesn't exist.
- GameBase.camera_unit = World.unit_by_name(GameBase.world, "camera")
- if GameBase.camera_unit == nil then
- GameBase.camera_unit = World.spawn_unit(GameBase.world, "core/units/camera")
- local scene_graph = World.scene_graph(GameBase.world)
- local camera_transform = SceneGraph.instance(scene_graph, GameBase.camera_unit)
- SceneGraph.set_local_position(scene_graph, camera_transform, Vector3(0, -15, 6.5))
- end
- if GameBase.game and GameBase.game.level_loaded then
- GameBase.game.level_loaded()
- end
- GameBase.screen_gui = World.create_screen_gui(GameBase.world)
- end
- function GameBase.update(dt)
- -- Update world
- World.update(GameBase.world, dt)
- if TEST then
- -- Stop the engine when the 'ESC' key is released.
- if Keyboard.released(Keyboard.button_id("escape")) then
- Device.quit()
- end
- end
- if GameBase.game and GameBase.game.update then
- GameBase.game.update(dt)
- end
- end
- function GameBase.render(dt)
- if GameBase.game and GameBase.game.render then
- GameBase.game.render(dt)
- end
- Device.render(GameBase.world, GameBase.camera_unit)
- end
- function GameBase.shutdown()
- if GameBase.game and GameBase.game.shutdown then
- GameBase.game.shutdown()
- end
- World.destroy_gui(GameBase.world, GameBase.screen_gui)
- Device.destroy_world(GameBase.world)
- if GameBase._test_package then
- Device.destroy_resource_package(GameBase._test_package)
- end
- end
- function GameBase.draw_help(controls, title)
- if not GameBase.show_help then
- return
- end
- local window_w, window_h = Device.resolution()
- local line_y = window_h - 60
- local key_x = 40
- local desc_x = key_x + 180
- local title_size = 32
- local title_margin = title_size + 15
- local paragraph_size = 21
- local paragraph_margin = paragraph_size + 10
- local font = "core/game/hud/debug"
- local material = "core/game/hud/debug"
- local background_color = Color4(0, 0, 0, 200)
- local title_color = Color4(220, 220, 220, 255)
- local paragraph_color = Color4(200, 200, 200, 255)
- Gui.rect(GameBase.screen_gui, Vector2(0, 0), Vector2(window_w, window_h), background_color)
- Gui.text(GameBase.screen_gui, Vector2(key_x, line_y), title_size, title, font, material, title_color)
- line_y = line_y - title_margin
- for _, v in pairs(controls) do
- Gui.text(GameBase.screen_gui, Vector2(key_x, line_y), paragraph_size, v.key, font, material, paragraph_color)
- Gui.text(GameBase.screen_gui, Vector2(desc_x, line_y), paragraph_size, v.desc, font, material, paragraph_color)
- line_y = line_y - paragraph_margin
- end
- end
|