main.lua 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. sm = nil,
  9. camera = nil,
  10. player = nil,
  11. players = {},
  12. player_i = 1,
  13. fullscreen = false
  14. }
  15. GameBase.game = Game
  16. GameBase.game_level = "levels/game"
  17. function Game.level_loaded()
  18. Game.pw = World.physics_world(GameBase.world)
  19. Game.rw = World.render_world(GameBase.world)
  20. Game.sg = World.scene_graph(GameBase.world)
  21. Game.sm = World.animation_state_machine(GameBase.world)
  22. -- Setup camera.
  23. local camera = World.camera_instance(GameBase.world, GameBase.camera_unit)
  24. World.camera_set_orthographic_size(GameBase.world, camera, 540/2/32)
  25. World.camera_set_projection_type(GameBase.world, camera, "orthographic")
  26. local camera_transform = SceneGraph.instance(Game.sg, GameBase.camera_unit)
  27. SceneGraph.set_local_position(Game.sg, camera_transform, Vector3(0, 0, 8))
  28. SceneGraph.set_local_rotation(Game.sg, camera_transform, Quaternion.from_axis_angle(Vector3.right(), -90*(math.pi/180.0)))
  29. -- Spawn characters.
  30. Game.players[1] = World.spawn_unit(GameBase.world, "units/soldier", Vector3(-2, 0, 0))
  31. Game.players[2] = World.spawn_unit(GameBase.world, "units/princess", Vector3(2, 0, 0))
  32. Game.player = Game.players[1]
  33. end
  34. function Game.update(dt)
  35. -- Stop the engine when the 'ESC' key is released.
  36. if Keyboard.released(Keyboard.button_id("escape")) then
  37. Device.quit()
  38. end
  39. -- Toggle fullscreen.
  40. if Keyboard.released(Keyboard.button_id("0")) then
  41. Game.fullscreen = not Game.fullscreen
  42. Window.set_fullscreen(Game.fullscreen)
  43. end
  44. -- Cycle through characters.
  45. if Pad1.pressed(Pad1.button_id("shoulder_right")) or Keyboard.pressed(Keyboard.button_id("j")) then
  46. local asm = AnimationStateMachine.instance(Game.sm, Game.player);
  47. AnimationStateMachine.trigger(Game.sm, asm, "idle")
  48. Game.player_i = Game.player_i % #Game.players + 1
  49. Game.player = Game.players[Game.player_i]
  50. end
  51. -- Read direction from joypad.
  52. local pad_dir = Pad1.axis(Pad1.axis_id("left"))
  53. -- Add keyboard contribution.
  54. if pad_dir.x == 0.0 and pad_dir.y == 0.0 then
  55. pad_dir.x = pad_dir.x + Keyboard.button(Keyboard.button_id("d")) - Keyboard.button(Keyboard.button_id("a"))
  56. pad_dir.y = pad_dir.y + Keyboard.button(Keyboard.button_id("w")) - Keyboard.button(Keyboard.button_id("s"))
  57. if Vector3.length(pad_dir) > 0.0001 then
  58. Vector3.normalize(pad_dir)
  59. end
  60. end
  61. -- Compute new player position.
  62. local player_speed = 4
  63. local player_tr = SceneGraph.instance(Game.sg, Game.player)
  64. local player_position = SceneGraph.local_position(Game.sg, player_tr)
  65. SceneGraph.set_local_position(Game.sg, player_tr, player_position + pad_dir*player_speed*dt)
  66. -- Sprite depth is proportional to its Z position.
  67. for i=1, #Game.players do
  68. local tr = SceneGraph.instance(Game.sg, Game.players[i])
  69. local pos = SceneGraph.local_position(Game.sg, tr)
  70. local depth = math.floor(1000 + (1000 - 32*pos.y))
  71. local sprite = RenderWorld.sprite_instance(Game.rw, Game.players[i])
  72. RenderWorld.sprite_set_depth(Game.rw, sprite, depth)
  73. end
  74. local asm = AnimationStateMachine.instance(Game.sm, Game.player);
  75. if pad_dir.x ~= 0.0 or pad_dir.y ~= 0.0 then
  76. local asm = AnimationStateMachine.instance(Game.sm, Game.player);
  77. local speed_x = AnimationStateMachine.variable_id(Game.sm, asm, "speed_x")
  78. local speed_y = AnimationStateMachine.variable_id(Game.sm, asm, "speed_y")
  79. local speed = AnimationStateMachine.variable_id(Game.sm, asm, "speed")
  80. AnimationStateMachine.set_variable(Game.sm, asm, speed_x, pad_dir.x)
  81. AnimationStateMachine.set_variable(Game.sm, asm, speed_y, pad_dir.y)
  82. AnimationStateMachine.set_variable(Game.sm, asm, speed, math.max(0.2, Vector3.length(pad_dir)))
  83. AnimationStateMachine.trigger(Game.sm, asm, "run")
  84. else
  85. AnimationStateMachine.trigger(Game.sm, asm, "idle")
  86. end
  87. -- Toggle help.
  88. if Keyboard.pressed(Keyboard.button_id("f1")) then
  89. GameBase.show_help = not GameBase.show_help
  90. end
  91. GameBase.draw_help({{ key = "f1", desc = "Toggle help" },
  92. { key = "w/a/s/d", desc = "Move" },
  93. { key = "j", desc = "Switch characters" },
  94. { key = "esc", desc = "Quit" }}
  95. , "Crown Animation Sample"
  96. )
  97. end
  98. function Game.render(dt)
  99. end
  100. function Game.shutdown()
  101. end