Untitled

 avatar
unknown
plain_text
a month ago
4.2 kB
2
Indexable
extends CharacterBody2D

# Prędkość ruchu
var speed = 200

# Maksymalne i aktualne życie bohatera
var max_health = 100
var current_health = 100

# Czy gracz jest martwy
var is_dead = false

# Zasięg ataku gracza
var attack_range = 50  # Zasięg w pikselach
var attack_damage = 50  # Ilość zadawanych obrażeń

# Załaduj scenę DamageLabel
onready var damage_label_scene = preload("res://DamageLabel.tscn")

# Funkcja do ustawienia na początku
func _ready():
	# Aktualizuje pasek życia na starcie gry
	update_health_bar()

# Funkcja przetwarzająca fizykę
func _physics_process(_delta):
	# Jeśli gracz jest martwy, ruch jest zablokowany
	if is_dead:
		return

	# Poruszanie się gracza
	var direction = Vector2.ZERO
	if Input.is_action_pressed("ui_right"):
		direction.x += 1
	if Input.is_action_pressed("ui_left"):
		direction.x -= 1
	if Input.is_action_pressed("ui_down"):
		direction.y += 1
	if Input.is_action_pressed("ui_up"):
		direction.y -= 1

	# Obsługa animacji
	if direction != Vector2.ZERO:
		velocity = direction.normalized() * speed
		$AnimatedSprite2D.play()
	else:
		velocity = Vector2.ZERO
		$AnimatedSprite2D.stop()

	move_and_slide()

	# Atakowanie przeciwnika
	if Input.is_action_just_pressed("ui_accept"):  # Domyślnie klawisz Enter/Spacja
		attack()

# Funkcja aktualizująca pasek życia
func update_health_bar():
	# Znajduje pasek życia i aktualizuje jego wartość
	var health_bar = get_tree().get_root().get_node_or_null("Main/UI/HealthBar")
	if health_bar == null:
		print("HealthBar nie został odnaleziony!")
		return
	health_bar.value = current_health

# Funkcja do przyjmowania obrażeń
func take_damage(amount):
	# Zmniejsz życie bohatera
	current_health -= amount
	current_health = clamp(current_health, 0, max_health)
	update_health_bar()

	# Wyświetlanie obrażeń nad postacią
	show_damage(amount)

	# Sprawdzanie, czy gracz umarł
	if current_health <= 0 and not is_dead:
		die()

# Funkcja do atakowania przeciwnika
func attack():
	print("Gracz atakuje!")
	for node in get_tree().get_nodes_in_group("enemies"):  # Szukamy wrogów w grupie "enemies"
		if position.distance_to(node.position) <= attack_range:  # Sprawdzamy zasięg
			node.take_damage(attack_damage)  # Wywołujemy obrażenia u przeciwnika
			print("Ork trafiony!")

# Funkcja do śmierci gracza
func die():
	# Gracz umiera
	is_dead = true
	print("Gracz umarł!")
	
	# Obracanie postaci o 90 stopni
	$AnimatedSprite2D.rotation_degrees = 90

	# Zatrzymanie animacji
	$AnimatedSprite2D.stop()
	
	# Wyświetlenie komunikatu "Nie żyjesz!"
	show_death_message()

	# Przeniesienie do menu głównego po 5 sekundach
	await get_tree().create_timer(5).timeout
	get_tree().change_scene_to_file("res://MainMenu.tscn")  # Upewnij się, że ścieżka jest poprawna

# Funkcja do wyświetlania komunikatu o śmierci
func show_death_message():
	# Dodanie napisu "Nie żyjesz!" na ekranie
	var death_label = Label.new()
	death_label.text = "Nie żyjesz!"
	death_label.set_anchors_and_offsets_preset(Control.PRESET_CENTER)
	death_label.modulate = Color(1, 0, 0)  # Czerwony tekst
	death_label.set_size(get_viewport_rect().size)
	death_label.z_index = 100  # Ustawienie na najwyższą warstwę
	add_child(death_label)

# Funkcja wyświetlania obrażeń
func show_damage(amount):
	var damage_text = damage_label_scene.instantiate()  # Tworzymy nową instancję etykiety
	get_parent().add_child(damage_text)  # Dodajemy ją do rodzica (sceny)

	# Ustawiamy pozycję obrażeń nad postacią
	damage_text.position = position + Vector2(0, -50)  # Wyświetl nad postacią

	# Ustawiamy tekst na wyświetlenie obrażeń
	damage_text.text = str(amount)

	# Uruchamiamy animację z `AnimationPlayer`
	var animation_player = damage_text.get_node("AnimationPlayer")
	if animation_player:
		animation_player.play("fade_out")  # Włącz animację zanikania

	# Usuwamy etykietę po czasie 1 sekundy
	await get_tree().create_timer(1).timeout  # Używamy 'await' zamiast 'yield'
	damage_text.queue_free()  # Usuń etykietę po 1 sekundzie
Leave a Comment