Parcourir la source

:sparkles: improved drag-drop logic

Felix Bytow il y a 10 mois
Parent
commit
e5994968bb

+ 4 - 0
assets/autoload/global_input.gd

@@ -7,6 +7,7 @@ const FULL_SCREEN_MODES: Array[DisplayServer.WindowMode] = [
 
 var dragged_object: Node2D = null
 var drop_spot: Node2D = null
+var original_z: int = 0
 
 func is_dragging() -> bool:
 	return dragged_object != null
@@ -15,12 +16,15 @@ func start_dragging(object: Node2D):
 	assert(object != null)
 	stop_dragging()
 	dragged_object = object
+	original_z = dragged_object.z_index
+	dragged_object.z_index = 1000
 
 func stop_dragging():
 	if dragged_object != null:
 		if drop_spot != null:
 			drop_spot.drop(dragged_object)
 		dragged_object.position = Vector2.ZERO
+		dragged_object.z_index = original_z
 		dragged_object = null
 
 func set_drop_spot(spot: Node2D):

+ 0 - 1
assets/scenes/demon.tscn

@@ -39,7 +39,6 @@ animations = [{
 size = Vector2(246.529, 258.823)
 
 [node name="Demon" type="Area2D" groups=["drag", "survivor"]]
-z_index = 4096
 z_as_relative = false
 scale = Vector2(0.17, 0.17)
 collision_layer = 128

+ 8 - 1
assets/scenes/player_spawn_zone.gd

@@ -30,7 +30,14 @@ func drop(object: Node2D) -> void:
 
 func _on_mouse_entered() -> void:
 	var da = GlobalInput.dragged_object
-	if da != null && da.is_in_group("survivor") && not is_occupied():
+	if da == null:
+		return
+	
+	var object_is_survivor = da.is_in_group("survivor")
+	var spot_is_free = not is_occupied()
+	var spot_is_not_source = not is_ancestor_of(da)
+	
+	if object_is_survivor && spot_is_free && spot_is_not_source:
 		GlobalInput.set_drop_spot(self)
 
 func _on_mouse_exited() -> void:

+ 9 - 2
assets/scenes/survivor_spot.gd

@@ -16,14 +16,21 @@ var highlighted: bool = false:
 			sprite.texture = STATES[0]
 
 func is_occupied():
-	return get_children().any(func (child): child.is_in_group("survivor"))
+	return get_children().any(func (child): return child.is_in_group("survivor"))
 
 func drop(object: Node2D):
 	object.reparent(self)
 
 func _on_mouse_entered():
 	var da = GlobalInput.dragged_object
-	if da != null && da.is_in_group("survivor") && not is_occupied():
+	if da == null:
+		return
+	
+	var object_is_survivor = da.is_in_group("survivor")
+	var spot_is_free = not is_occupied()
+	var spot_is_not_source = not is_ancestor_of(da)
+	
+	if object_is_survivor && spot_is_free && spot_is_not_source:
 		highlighted = true
 		GlobalInput.set_drop_spot(self)