Browse Source

Keep players during level switching

Avoid new instances of player to be instanciated at each round.
DricomDragon 5 years ago
parent
commit
91e7f5ce22
5 changed files with 56 additions and 51 deletions
  1. 27 20
      Game.gd
  2. 1 1
      Game.tscn
  3. 5 5
      MainCamera.gd
  4. 22 25
      Player.gd
  5. 1 0
      Player.tscn

+ 27 - 20
Game.gd

@@ -25,28 +25,35 @@ func _ready():
 		if !levelSceneToLoop:
 			push_error("Cant't load level " + levelToLoop)
 
+	# Create players
+	var player
+	for k in 2:
+		player = playerScene.instance()
+		player.grid = levelCurrentNode
+		player.turn_left_action = playerActionsLeft[k]
+		player.turn_right_action = playerActionsRight[k]
+		player.position = Vector2()
+		add_child(player)
+
 func load_level(name):
 	var fullName = "res://Levels/" + name + ".tscn"
 	return load(fullName)
 
 func _unhandled_input(event):
 	if event.is_action("ui_accept") and event.is_pressed():
-		if get_tree().has_group("living"):
-			var living = get_tree().get_nodes_in_group("living")
-			if !living.empty():
+		if get_tree().has_group("running"):
+			var running = get_tree().get_nodes_in_group("running")
+			if !running.empty():
 				return
 		create_game()
 
 func create_game():
 	# Clear if required
-	if get_tree().has_group("players"):
-		var players = get_tree().get_nodes_in_group("players")
-		for p in players:
-			p.queue_free()
 	if levelCurrentNode:
 		remove_child(levelCurrentNode)
 		levelCurrentNode.queue_free()
 
+	# Create level node
 	if levelToLoop:
 		levelCurrentNode = levelSceneToLoop.instance()
 	else:
@@ -64,24 +71,24 @@ func create_game():
 
 	add_child(levelCurrentNode)
 
-	# Retrieve player spawn points
+	# Allocate spawn points to players
 	var spawners = get_tree().get_nodes_in_group("spawn")
 	spawners.shuffle()
 
-	# Create players
-	var player
+	var p = get_tree().get_nodes_in_group("players")
 
-	for k in 3:
-		player = playerScene.instance()
-		player.grid = levelCurrentNode
-		player.turn_left_action = playerActionsLeft[k]
-		player.turn_right_action = playerActionsRight[k]
-		player.position = spawners[k].position
-		player.rotation = spawners[k].rotation
-		add_child(player)
+	for k in p.size():
+		# TODO : Put arguments in callback
+		p[k].grid = levelCurrentNode
+		p[k].position = spawners[k].position
+		p[k].rotation = spawners[k].rotation
+		p[k]._on_spawn()
 
 	# Delay start
 	timer.start()
 
-func _on_game_start():
-	get_tree().call_group("players", "_on_game_start")
+func _on_round_start():
+	get_tree().call_group("players", "_on_round_start")
+
+func _on_round_end():
+	get_tree().call_group("players", "_on_round_end")

+ 1 - 1
Game.tscn

@@ -26,4 +26,4 @@ align = 1
 __meta__ = {
 "_edit_use_anchors_": false
 }
-[connection signal="timeout" from="StartTimer" to="." method="_on_game_start"]
+[connection signal="timeout" from="StartTimer" to="." method="_on_round_start"]

+ 5 - 5
MainCamera.gd

@@ -10,17 +10,17 @@ func move():
 	if !get_tree().has_group("players"):
 		return
 
-	var living
-	if get_tree().has_group("living"):
-		living = get_tree().get_nodes_in_group("living")
+	var running
+	if get_tree().has_group("running"):
+		running = get_tree().get_nodes_in_group("running")
 
-	if !living or living.size() == 0:
+	if !running or running.size() == 0:
 		# Show every players
 		var players = get_tree().get_nodes_in_group("players")
 		center_on(players)
 	else:
 		# Show remaining players only
-		center_on(living)
+		center_on(running)
 
 func center_on(players):
 	var position_accumulator = Vector2(0.0, 0.0)

+ 22 - 25
Player.gd

@@ -5,9 +5,9 @@ var grid:TileMap
 onready var tween = $Tween
 
 # Misc
-var cell_size
-var cell_half_size
-var alive = false
+const cell_size = 64
+const cell_half_size = 32
+var running = false
 
 # Enum
 enum Direction {
@@ -39,22 +39,10 @@ export var turn_right_action:String
 
 func _ready():
 	add_to_group("players")
-	spring()
 
-	assert(grid)
 	assert(turn_left_action)
 	assert(turn_right_action)
 
-	cell_size = int (grid.get_cell_size().x)
-	cell_half_size = cell_size / 2
-
-	# Adjust spawn situation
-	posix = int (position.x / 64)
-	posiy = int (position.y / 64)
-	dire = int((rotation_degrees + 45) / 90)
-
-	apply_turn()
-
 	tween.connect_into(self)
 
 func _unhandled_input(event):
@@ -66,8 +54,16 @@ func _unhandled_input(event):
 			prepare_turn(Side.RIGHT)
 			get_tree().set_input_as_handled()
 
-func _on_game_start():
-	move()
+func _on_spawn():
+	# Adjust spawn situation
+	posix = int (position.x / cell_size)
+	posiy = int (position.y / cell_size)
+	dire = int((rotation_degrees + 45) / 90)
+	apply_turn()
+
+func _on_round_start():
+	assert(grid)
+	spring()
 
 func _on_tween_completed(_o, key):
 	if (key == ":position"):
@@ -125,7 +121,7 @@ func apply_turn():
 		push_error("dire out of range")
 
 func move():
-	if !alive:
+	if !running:
 		return
 
 	generate_wall()
@@ -151,13 +147,14 @@ func has_block_on(left_or_right:int):
 	return grid.get_cell(bposx, bposy) == 1
 
 func die():
-	if alive:
-		remove_from_group("living")
-	alive = false
+	if running:
+		remove_from_group("running")
+	running = false
 
 func spring():
-	alive = true
-	add_to_group("living")
+	running = true
+	add_to_group("running")
+	move()
 
-func is_alive():
-	return alive
+func is_running():
+	return running

+ 1 - 0
Player.tscn

@@ -11,6 +11,7 @@ extents = Vector2( 16, 16 )
 script = ExtResource( 1 )
 
 [node name="Sprite" type="Sprite" parent="."]
+z_index = 1
 texture = ExtResource( 2 )
 __meta__ = {
 "_edit_lock_": true