main.lua 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. -- Copyright (c) 2012-2025 Daniele Bartolini et al.
  2. -- SPDX-License-Identifier: MIT
  3. require "core/game/camera"
  4. Game = Game or {
  5. pw = nil,
  6. rw = nil,
  7. sg = nil,
  8. debug_graphics = false,
  9. debug_physics = false,
  10. camera = nil,
  11. cursor = { modes = { "normal", "disabled"}, current_mode = 1 },
  12. }
  13. GameBase.game = Game
  14. GameBase.game_level = "levels/test"
  15. function Game.level_loaded()
  16. Game.pw = World.physics_world(GameBase.world)
  17. Game.rw = World.render_world(GameBase.world)
  18. Game.sg = World.scene_graph(GameBase.world)
  19. Game.camera = FPSCamera(GameBase.world, GameBase.camera_unit)
  20. -- Debug.
  21. PhysicsWorld.enable_debug_drawing(Game.pw, Game.debug_physics)
  22. RenderWorld.enable_debug_drawing(Game.rw, Game.debug_graphics)
  23. end
  24. function Game.update(dt)
  25. -- Stop the engine when the 'ESC' key is released.
  26. if Keyboard.released(Keyboard.button_id("escape")) then
  27. Device.quit()
  28. end
  29. -- Toggle debug drawing.
  30. if Keyboard.released(Keyboard.button_id("z")) then
  31. Game.debug_physics = not Game.debug_physics
  32. PhysicsWorld.enable_debug_drawing(Game.pw, Game.debug_physics)
  33. end
  34. if Keyboard.released(Keyboard.button_id("x")) then
  35. Game.debug_graphics = not Game.debug_graphics
  36. RenderWorld.enable_debug_drawing(Game.rw, Game.debug_graphics)
  37. end
  38. -- Shoot a sphere when left mouse button is pressed.
  39. if Mouse.pressed(Mouse.button_id("left")) then
  40. local tr = SceneGraph.instance(Game.sg, Game.camera:unit())
  41. local pos = SceneGraph.local_position(Game.sg, tr)
  42. local dir = Matrix4x4.y(SceneGraph.local_pose(Game.sg, tr))
  43. local u1 = World.spawn_unit(GameBase.world, "units/sphere", pos)
  44. local a1 = PhysicsWorld.actor_instance(Game.pw, u1)
  45. Vector3.normalize(dir)
  46. PhysicsWorld.actor_add_impulse(Game.pw, a1, dir * 500.0)
  47. end
  48. -- Perform a raycast when middle mouse button is pressed.
  49. if Mouse.pressed(Mouse.button_id("middle")) then
  50. local tr = SceneGraph.instance(Game.sg, Game.camera:unit())
  51. local pos = SceneGraph.local_position(Game.sg, tr)
  52. local dir = Matrix4x4.z(SceneGraph.local_pose(Game.sg, tr))
  53. local hit, pos, normal, time, unit, actor = PhysicsWorld.cast_ray(Game.pw, pos, dir, 100)
  54. if hit then
  55. PhysicsWorld.actor_add_impulse(Game.pw, actor, dir * 400.0)
  56. end
  57. end
  58. -- Toggle mouse cursor modes.
  59. if Keyboard.released(Keyboard.button_id("space")) then
  60. Game.cursor.current_mode = 1 + Game.cursor.current_mode % #Game.cursor.modes
  61. Window.set_cursor_mode(Game.cursor.modes[Game.cursor.current_mode])
  62. end
  63. -- Toggle help.
  64. if Keyboard.pressed(Keyboard.button_id("f1")) then
  65. GameBase.show_help = not GameBase.show_help
  66. end
  67. GameBase.draw_help({{ key = "f1", desc = "Toggle help" },
  68. { key = "w/a/s/d", desc = "Move" },
  69. { key = "left click", desc = "Shoot" },
  70. { key = "space", desc = "Toggle mouse lock" },
  71. { key = "z", desc = "Toggle physics debug" },
  72. { key = "x", desc = "Toggle graphics debug" },
  73. { key = "esc", desc = "Quit" }}
  74. , "Crown Physics Sample"
  75. )
  76. -- Update camera.
  77. local delta = Mouse.axis(Mouse.axis_id("cursor_delta"))
  78. Game.camera:update(dt, delta.x, delta.y)
  79. end
  80. function Game.render(dt)
  81. end
  82. function Game.shutdown()
  83. end