Game.gd 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. levelCurrentNode.queue_free()
  30. # Select level
  31. levelIndex += 1
  32. if (levelIndex >= levelScenes.size()):
  33. levelIndex = 0
  34. if !levelScenes[levelIndex]:
  35. levelScenes[levelIndex] = load(levelNames[levelIndex])
  36. # Load level
  37. levelCurrentNode = levelScenes[levelIndex].instance()
  38. add_child(levelCurrentNode)
  39. # Create players
  40. var player
  41. # Player 1
  42. player = playerScene.instance()
  43. player.grid = levelCurrentNode
  44. player.turn_left_action = "p1_left"
  45. player.turn_right_action = "p1_right"
  46. player.position = Vector2(4 * 64 + 32, 8 * 64 + 32)
  47. add_child(player)
  48. # Player 2
  49. player = playerScene.instance()
  50. player.grid = levelCurrentNode
  51. player.turn_left_action = "p2_left"
  52. player.turn_right_action = "p2_right"
  53. player.position = Vector2(6 * 64 + 32, 8 * 64 + 32)
  54. add_child(player)
  55. # Player 3
  56. player = playerScene.instance()
  57. player.grid = levelCurrentNode
  58. player.turn_left_action = "p3_left"
  59. player.turn_right_action = "p3_right"
  60. player.position = Vector2(8 * 64 + 32, 8 * 64 + 32)
  61. add_child(player)
  62. # TODO Timer
  63. get_tree().call_group("players", "_on_game_start")
  64. func move_camera():
  65. if !get_tree().has_group("players"):
  66. return
  67. var living
  68. if get_tree().has_group("living"):
  69. living = get_tree().get_nodes_in_group("living")
  70. if !living or living.size() == 0:
  71. # Show every players
  72. var players = get_tree().get_nodes_in_group("players")
  73. center_on(players)
  74. else:
  75. # Show remaining players only
  76. center_on(living)
  77. func center_on(players):
  78. var position_accumulator = Vector2(0.0, 0.0)
  79. for p in players:
  80. position_accumulator += p.position
  81. cam.position = position_accumulator / players.size()
  82. var dist = 0
  83. for i in range(players.size() - 1):
  84. for j in range(i + 1, players.size()):
  85. dist = max(dist, players[i].position.distance_to(players[j].position))
  86. # Extend camera zoom if liners are far from each other
  87. var zoom = 1.0
  88. if dist > dist_max:
  89. zoom += (dist - dist_max) * zoom_rate
  90. cam.zoom = Vector2(zoom, zoom)