Getting variables from other scenes

This is the code I have for the player:

extends CharacterBody2D

signal health_depleted

var health = 100.0
const damage_rate = 10.0
var attacking: bool = false

func _ready():
	%AnimationPlayer.animation_finished.connect(_on_animation_finished)

func _physics_process(delta):
	var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down")
	if attacking:
		velocity = Vector2.ZERO
	else:
		velocity = direction * 400
	move_and_slide()
	
	if not attacking:
		if velocity.length() > 0.0:
			%Bluwee.play_run()
		else:
			%Bluwee.play_idle()
	
	if Input.is_action_just_pressed("attack") and not attacking:
		attacking = true
		handle_attack_animation()
	
	var overlapping_mobs = %HurtBox.get_overlapping_bodies()
	if overlapping_mobs.size() > 0:
		health -= damage_sheep * overlapping_mobs.size() * delta
		%ProgressBar.value = health
		if health <= 0.0:
			health_depleted.emit()

func handle_attack_animation():
	var mouse_position = get_global_mouse_position()
	var vector_to_mouse = (mouse_position - global_position).normalized()
	var angle_to_mouse = vector_to_mouse.angle()  # Angle in radians
	# Convert angle to degrees for easier comparisons
	var angle_in_degrees = rad_to_deg(angle_to_mouse)
	
	# Adjust for top-down orientation (0 degrees = up)
	if angle_in_degrees < 0:
		angle_in_degrees += 360
	
	# Determine animation based on the angle
	if angle_in_degrees >= 315 or angle_in_degrees < 45:
		%Bluwee.play_attack()  # Mouse is above the player
	elif angle_in_degrees >= 45 and angle_in_degrees < 135:
		%Bluwee.play_down_attack()  # Mouse is to the right of the player
	elif angle_in_degrees >= 225 and angle_in_degrees < 315:
		%Bluwee.play_up_attack()  # Mouse is below the player
	elif angle_in_degrees >= 135 and angle_in_degrees < 225:
		%Bluwee.play_left_attack()  # Placeholder for left attacks if needed

func _on_animation_finished(animation: String):
	# Reset attacking flag when the attack animation is done
	if animation in ["right_attack", "back_attack", "front_attack", "left_attack"]:
		attacking = false
		%WarriorBlue.scale.x = 1
		%Bluwee.play_idle()

This is the code I have for the sheep:

extends StaticBody2D

var health = 50.0
var damage_sheep := 1.0

func _ready():
	var sheep_anim = $AnimationPlayer
	sheep_anim.play("idle")

I am trying to make the player take damage whenever he touches the sheep. But for that I’d need to get the variable from the sheep scene to use it in the player scene

You can get the variable if you have a reference to a sheep node. I assume your %HurtBox node uses layers to ensure that only sheep are detected, in which case, you can do this:

	var overlapping_mobs = %HurtBox.get_overlapping_bodies()
	if overlapping_mobs.size() > 0:
		var sheep = overlapping_mobs[0]
		health -= sheep.damage_sheep * overlapping_mobs.size() * delta

it’s not working T_T

i think the godot way would be to get a reference from the sheep inside your player node by the @export annotation and drag and drop the sheep node/scene in the inspector

@export var sheep_instance: PackedScene

then you can modify your function like

health -= sheep.damage_sheep

In what way is it not working? Is there an error message? Is nothing happening? Does the game crash?

nevermind, I ended up just creating a global variable.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.