Game.gd 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. extends Node2D
  2. onready var cam = $MainCamera
  3. export var dist_max = 900
  4. export var zoom_rate = 0.001
  5. var levelNames = ["res://Levels/Lab.tscn", "res://Levels/Square.tscn"]
  6. var levelScenes = []
  7. var levelCurrentNode
  8. var levelIndex = -1
  9. var playerScene = preload("res://Player.tscn")
  10. func _ready():
  11. for k in range(levelNames.size()):
  12. levelScenes.append(null)
  13. func _process(_d):
  14. move_camera()
  15. func _unhandled_input(event):
  16. if event.is_action("ui_accept") and event.is_pressed():
  17. if get_tree().has_group("living"):
  18. var living = get_tree().get_nodes_in_group("living")
  19. if !living.empty():
  20. return
  21. start()
  22. func start():
  23. # Clear if required
  24. if (get_tree().has_group("players")):
  25. var players = get_tree().get_nodes_in_group("players")
  26. for p in players:
  27. p.queue_free()
  28. if (levelCurrentNode):
  29. remove_child(levelCurrentNode)
  30. levelCurrentNode.queue_free()
  31. # Select level
  32. levelIndex += 1
  33. if (levelIndex >= levelScenes.size()):
  34. levelIndex = 0
  35. if !levelScenes[levelIndex]:
  36. levelScenes[levelIndex] = load(levelNames[levelIndex])
  37. # Load level
  38. levelCurrentNode = levelScenes[levelIndex].instance()
  39. add_child(levelCurrentNode)
  40. # Retrieve player spawn points
  41. var spawners = get_tree().get_nodes_in_group("spawn")
  42. # Create players
  43. var player
  44. # Player 1
  45. player = playerScene.instance()
  46. player.grid = levelCurrentNode
  47. player.turn_left_action = "p1_left"
  48. player.turn_right_action = "p1_right"
  49. player.position = spawners[0].position
  50. add_child(player)
  51. # Player 2
  52. player = playerScene.instance()
  53. player.grid = levelCurrentNode
  54. player.turn_left_action = "p2_left"
  55. player.turn_right_action = "p2_right"
  56. player.position = spawners[1].position
  57. add_child(player)
  58. # Player 3
  59. player = playerScene.instance()
  60. player.grid = levelCurrentNode
  61. player.turn_left_action = "p3_left"
  62. player.turn_right_action = "p3_right"
  63. player.position = spawners[2].position
  64. add_child(player)
  65. # TODO Timer
  66. get_tree().call_group("players", "_on_game_start")
  67. func move_camera():
  68. if !get_tree().has_group("players"):
  69. return
  70. var living
  71. if get_tree().has_group("living"):
  72. living = get_tree().get_nodes_in_group("living")
  73. if !living or living.size() == 0:
  74. # Show every players
  75. var players = get_tree().get_nodes_in_group("players")
  76. center_on(players)
  77. else:
  78. # Show remaining players only
  79. center_on(living)
  80. func center_on(players):
  81. var position_accumulator = Vector2(0.0, 0.0)
  82. for p in players:
  83. position_accumulator += p.position
  84. cam.position = position_accumulator / players.size()
  85. var dist = 0
  86. for i in range(players.size() - 1):
  87. for j in range(i + 1, players.size()):
  88. dist = max(dist, players[i].position.distance_to(players[j].position))
  89. # Extend camera zoom if liners are far from each other
  90. var zoom = 1.0
  91. if dist > dist_max:
  92. zoom += (dist - dist_max) * zoom_rate
  93. cam.zoom = Vector2(zoom, zoom)