main.lua 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. require "core/game/camera"
  2. Game = Game or {
  3. pw = nil,
  4. rw = nil,
  5. sg = nil,
  6. debug_graphics = false,
  7. debug_physics = false,
  8. camera = nil,
  9. }
  10. GameBase.game = Game
  11. GameBase.game_level = "levels/test"
  12. local cursor_modes = {"normal", "disabled"}
  13. local cursor_mode_nxt_idx = 2
  14. function Game.level_loaded()
  15. Game.pw = World.physics_world(GameBase.world)
  16. Game.rw = World.render_world(GameBase.world)
  17. Game.sg = World.scene_graph(GameBase.world)
  18. -- Spawn camera
  19. local camera_unit = World.spawn_unit(GameBase.world, "core/units/camera")
  20. local tr = SceneGraph.instance(Game.sg, camera_unit);
  21. SceneGraph.set_local_position(Game.sg, tr, Vector3(0, 6.5, -30))
  22. GameBase.game_camera = camera_unit
  23. Game.camera = FPSCamera(GameBase.world, camera_unit)
  24. -- Debug
  25. PhysicsWorld.enable_debug_drawing(Game.pw, debug_physics)
  26. RenderWorld.enable_debug_drawing(Game.rw, debug_graphics)
  27. end
  28. function Game.update(dt)
  29. -- Stop the engine when the 'ESC' key is released
  30. if Keyboard.released(Keyboard.button_id("escape")) then
  31. Device.quit()
  32. end
  33. if Keyboard.released(Keyboard.button_id("z")) then
  34. debug_physics = not debug_physics
  35. PhysicsWorld.enable_debug_drawing(Game.pw, debug_physics)
  36. end
  37. if Keyboard.released(Keyboard.button_id("x")) then
  38. debug_graphics = not debug_graphics
  39. RenderWorld.enable_debug_drawing(Game.rw, debug_graphics)
  40. end
  41. -- Spawn a sphere when left mouse button is pressed
  42. if Mouse.pressed(Mouse.button_id("left")) then
  43. local tr = SceneGraph.instance(Game.sg, Game.camera:unit())
  44. local pos = SceneGraph.local_position(Game.sg, tr)
  45. local dir = Matrix4x4.z(SceneGraph.local_pose(Game.sg, tr))
  46. local u1 = World.spawn_unit(GameBase.world, "units/sphere", pos)
  47. local a1 = PhysicsWorld.actor_instance(Game.pw, u1)
  48. Vector3.normalize(dir)
  49. PhysicsWorld.actor_add_impulse(Game.pw, a1, dir * 500.0)
  50. end
  51. -- Perform a raycast when middle mouse button is pressed
  52. if Mouse.pressed(Mouse.button_id("middle")) then
  53. local tr = SceneGraph.instance(Game.sg, Game.camera:unit())
  54. local pos = SceneGraph.local_position(Game.sg, tr)
  55. local dir = Matrix4x4.z(SceneGraph.local_pose(Game.sg, tr))
  56. local hit, pos, normal, time, unit, actor = PhysicsWorld.cast_ray(Game.pw, pos, dir, 100)
  57. if hit then
  58. PhysicsWorld.actor_add_impulse(Game.pw, actor, dir * 400.0)
  59. end
  60. end
  61. -- Toggle mouse cursor modes
  62. if Keyboard.released(Keyboard.button_id("space")) then
  63. Window.set_cursor_mode(cursor_modes[cursor_mode_nxt_idx])
  64. cursor_mode_nxt_idx = 1 + cursor_mode_nxt_idx % 2
  65. end
  66. -- Update camera
  67. local delta = Mouse.axis(Mouse.axis_id("cursor_delta"))
  68. Game.camera:update(dt, delta.x, delta.y)
  69. end
  70. function Game.render(dt)
  71. end
  72. function Game.shutdown()
  73. end