Untitled
unknown
plain_text
a year ago
4.2 kB
6
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
Editor is loading...
Leave a Comment