41 lines
1.5 KiB
GDScript
41 lines
1.5 KiB
GDScript
extends Node2D # Boleh juga pakai CharacterBody2D karena tidak pakai collision
|
|
|
|
@onready var animasi: AnimationPlayer = $animasi
|
|
|
|
func _ready() -> void:
|
|
# Saat pertama kali muncul, pastikan animasi berhenti atau diam
|
|
if animasi:
|
|
animasi.stop()
|
|
|
|
# 🏃♂️ FUNGSI UTAMA: Dipanggil dari skrip Stage untuk menyuruh NPC bergerak
|
|
func gerak_ke_posisi(posisi_tujuan: Vector2, durasi: float) -> void:
|
|
if not animasi:
|
|
print("⚠️ Peringatan: AnimationPlayer bernama 'animasi' tidak ditemukan!")
|
|
return
|
|
|
|
print("🚶♂️ NPC diperintah bergerak ke: ", posisi_tujuan, " selama ", durasi, " detik.")
|
|
|
|
# 1. Mainkan animasi jalanmu (yang bernama "idle")
|
|
if animasi.has_animation("idle"):
|
|
animasi.play("idle")
|
|
|
|
# 2. Atur arah hadap (flip visual) berdasarkan posisi tujuan
|
|
# Jika visual NPC kamu dibungkus dalam node bernama 'Visual' atau 'Sprite2D',
|
|
# sesuaikan bagian scale.x ini dengan struktur nodemu ya.
|
|
if posisi_tujuan.x > global_position.x:
|
|
scale.x = abs(scale.x) # Hadap kanan
|
|
else:
|
|
scale.x = -abs(scale.x) # Hadap kiri
|
|
|
|
# 3. Gerakkan NPC menggunakan Tween agar mulus dan tembus objek
|
|
var tween = create_tween()
|
|
tween.tween_property(self, "global_position", posisi_tujuan, durasi).set_trans(Tween.TRANS_LINEAR)
|
|
|
|
# 4. Begitu sampai di tujuan, hentikan animasi jalan
|
|
tween.finished.connect(_on_gerak_selesai)
|
|
|
|
func _on_gerak_selesai() -> void:
|
|
print("🛑 NPC sudah sampai di tujuan.")
|
|
if animasi:
|
|
animasi.stop() # Hentikan animasi karena sudah sampai
|