Untitled
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