main.lua 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. require "core/game/camera"
  2. Game = Game or {
  3. pw = nil,
  4. rw = nil,
  5. sg = nil,
  6. sm = nil,
  7. camera = nil,
  8. player = nil,
  9. players = {},
  10. player_i = 1,
  11. fullscreen = false
  12. }
  13. GameBase.game = Game
  14. GameBase.game_level = "levels/game"
  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.sm = World.animation_state_machine(GameBase.world)
  20. -- Spawn camera
  21. local camera_unit = World.spawn_unit(GameBase.world, "core/units/camera")
  22. World.camera_set_orthographic_size(GameBase.world, camera_unit, 540/2/32)
  23. World.camera_set_projection_type(GameBase.world, camera_unit, "orthographic")
  24. SceneGraph.set_local_position(Game.sg, camera_unit, Vector3(0, 8, 0))
  25. SceneGraph.set_local_rotation(Game.sg, camera_unit, Quaternion.from_axis_angle(Vector3.right(), 90*(math.pi/180.0)))
  26. GameBase.game_camera = camera_unit
  27. -- Spawn characters
  28. Game.players[1] = World.spawn_unit(GameBase.world, "units/soldier", Vector3(-2, 0, 0))
  29. Game.players[2] = World.spawn_unit(GameBase.world, "units/princess", Vector3(2, 0, 0))
  30. Game.player = Game.players[1]
  31. end
  32. function Game.update(dt)
  33. -- Stop the engine when the 'ESC' key is released
  34. if Keyboard.released(Keyboard.button_id("escape")) then
  35. Device.quit()
  36. end
  37. -- Toggle fullscreen
  38. if Keyboard.released(Keyboard.button_id("0")) then
  39. Game.fullscreen = not Game.fullscreen
  40. Window.set_fullscreen(Game.fullscreen)
  41. end
  42. -- Cycle through characters
  43. if Pad1.pressed(Pad1.button_id("shoulder_right")) or Keyboard.pressed(Keyboard.button_id("j")) then
  44. AnimationStateMachine.trigger(Game.sm, Game.player, "idle")
  45. Game.player_i = Game.player_i % #Game.players + 1
  46. Game.player = Game.players[Game.player_i]
  47. end
  48. -- Player movement
  49. local function swap_yz(vector3_xy)
  50. return Vector3(vector3_xy.x, 0, vector3_xy.y)
  51. end
  52. -- Read direction from joypad
  53. local pad_dir = Pad1.axis(Pad1.axis_id("left"))
  54. -- Add keyboard contribution
  55. if pad_dir.x == 0.0 and pad_dir.y == 0.0 then
  56. pad_dir.x = pad_dir.x + Keyboard.button(Keyboard.button_id("d")) - Keyboard.button(Keyboard.button_id("a"))
  57. pad_dir.y = pad_dir.y + Keyboard.button(Keyboard.button_id("w")) - Keyboard.button(Keyboard.button_id("s"))
  58. end
  59. -- Compute new player position
  60. local player_speed = 4
  61. local player_position = SceneGraph.local_position(Game.sg, Game.player)
  62. SceneGraph.set_local_position(Game.sg, Game.player, player_position + swap_yz(pad_dir)*player_speed*dt)
  63. -- Sprite depth is proportional to its Z position
  64. for i=1, #Game.players do
  65. local pos = SceneGraph.local_position(Game.sg, Game.players[i])
  66. local depth = math.floor(1000 + (1000 - 32*pos.z))
  67. RenderWorld.sprite_set_depth(Game.rw, Game.players[i], depth)
  68. end
  69. if pad_dir.x ~= 0.0 or pad_dir.y ~= 0.0 then
  70. local speed_x = AnimationStateMachine.variable_id(Game.sm, Game.player, "speed_x")
  71. local speed_y = AnimationStateMachine.variable_id(Game.sm, Game.player, "speed_y")
  72. local speed = AnimationStateMachine.variable_id(Game.sm, Game.player, "speed")
  73. AnimationStateMachine.set_variable(Game.sm, Game.player, speed_x, pad_dir.x)
  74. AnimationStateMachine.set_variable(Game.sm, Game.player, speed_y, pad_dir.y)
  75. AnimationStateMachine.set_variable(Game.sm, Game.player, speed, math.max(0.2, Vector3.length(pad_dir)))
  76. AnimationStateMachine.trigger(Game.sm, Game.player, "run")
  77. else
  78. AnimationStateMachine.trigger(Game.sm, Game.player, "idle")
  79. end
  80. end
  81. function Game.render(dt)
  82. end
  83. function Game.shutdown()
  84. end