How to change the behaviour of each instance of a scene individually using code

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By sachein

Hi, I am new to the Godot game engine and I am trying to create a simple platformer game with some spikes in which his life will be reduced if the character hits on it. I created a separate area 2d scene for the spike and imported it into the main scene where the player(It is the first level). I signaled it with the player script and reduced the health variable which if it reached zero the player dies. I don’t have any problem with it. But I want to add another feature, whenever the player hits the spike, the sprite associated with it should change from a normal sprite to a sprite that contains blood in it. I implemented it with code, but the problem is that even if he hits one of the spikes, all the spikes change to the sprite with blood in it. I want to modify each of the spike’s sprites individually which are the instances of the main sprite scene. Please let me know how to do that

This is my player script (Contains everything from his movement, crouching and health, etc). Also, he is a kinematic body 2d

    extends KinematicBody2D

    var isCrouching
    var isCealing
    var velocity = Vector2.ZERO
    var isdead = false

    export (int) var speed = 1200
    export (int) var jump_speed = 1800
    export (int) var gravity = 4000
    export (float) var fallMultiplayer = 0.25
    export (int) var crouchSpeedReduce = 300
export (int) var health = 5000
export (int) var damage = 200

onready var parent = get_parent()
onready var crouchCheck = $crouchCheck
onready var playersprite = $player/Sprite
onready var crouchsprite = $crouch/crouchsprite
onready var colloider = $player 
onready var crouch= $crouch
onready var deathsprite = $player/Sprite2
onready var damager = get_node("../damager")


func _movement(delta):
	velocity.x = 0
	if Input.is_action_pressed("Move_right") && !isCrouching:
		velocity.x += speed
	elif Input.is_action_pressed("Move_right") && isCrouching:
		velocity.x += (speed - crouchSpeedReduce)
	if Input.is_action_pressed("move_left") && !isCrouching:
		velocity.x -= speed
	elif Input.is_action_pressed("move_left") && isCrouching:
		velocity.x -= (speed - crouchSpeedReduce)
	
	velocity.y += gravity * delta

func _crouch():
	if crouch.disabled == false:
		isCrouching = true
	else:
		isCrouching = false
		
	if Input.is_action_pressed("Crouch"):
		_crouchon()
	elif isCrouching == true && isCealing == true :
		_crouchon()
	else:
		_crouchoff()

	if crouchCheck.is_colliding() == true:
		isCealing = true
	else:
		isCealing = false

func _jump(delta):
	if !Input.is_action_pressed("Jump") && !isCrouching:
		velocity.y += gravity * delta 
	else:
		velocity.y += (gravity * fallMultiplayer) * delta

	velocity = move_and_slide(velocity, Vector2.UP)

	if Input.is_action_just_pressed("Jump") && !isCrouching:
		if is_on_floor():
			velocity.y -= jump_speed

func _crouchon ():
	crouch.disabled = false
	colloider.disabled = true
	playersprite.visible = false
	crouchsprite.visible = true
func _crouchoff ():
	crouch.disabled = true
	colloider.disabled = false
	playersprite.visible = true
	crouchsprite.visible = false	

#Actual Update function

#func _spriteChange():
#	if health < 5000:
#		damager.get_node("Spike").visible = false
#		damager.get_node("death_spike").visible = true
#	else:
#		damager.get_node("Spike").visible = true
#		damager.get_node("death_spike").visible = false

func _physics_process(delta):
	if !isdead:
		_movement(delta)
		_jump(delta)
		_crouch()
	else:
		deathsprite.visible = true
 		playersprite.visible = false
 #	_spriteChange()
 	if health <= 0:
		isdead = true


 func _on_KinematicBody2D_body_entered(body: Node) -> void:
	health -= damage

And this is the code for the sprite

extends Area2D

onready var spike = $Spike
onready var death_spike = $death_spike

#func _physics_process(delta):
#	if data.isdamaged:
#		spike.visible = false
#		death_spike.visible = true


func _on_collisioncheck_area_entered(area):
		spike.visible = false
		death_spike.visible = true
:bust_in_silhouette: Reply From: dethland

The instances of the spike suppose to be individuals during the game. They should not jam with each other. Otherwise, there are some shared variables (or some signal) that triggered the problem.