Bileşen Olarak Düğümler
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 42 / 65.
Bir Node düğümünün alt düğümleri olabilir. Godot oyun nesnelerini bu şekilde oluşturur: bir kahraman düğümü, sağlık veya hareket gibi her yetenek için bir alt düğüm alır. Her alt düğüm bir bileşendir: tek bir işi yapan küçük bir düğüm.
# health.gd
class_name Health
extends Node
var hp := 10
func _ready() -> void:
print("Health ready")
# hero.gd
class_name Hero
extends Node
func _init() -> void:
var health := Health.new()
health.name = "Health"
add_child(health)
func _ready() -> void:
print("Hero ready, hp: ", $Health.hp)add_child() bir düğümü çocuk olarak ekler. Her bileşene bir name verin: get_node("Health") veya kısa biçimi olan $Health, çocuğu bu adla bulur. Adı olmayan veya adı bir kardeş düğüm tarafından alınmış olan bir düğüme @Node@4 gibi otomatik bir ad verilir.
Bir düğümün _ready() yöntemi, oyunun çalıştığı düğüm ağacı olan sahne ağacına girdiğinde çalışır. main.gd ağaçta olduğundan, kahramanı ona eklemek her iki _ready() yöntemini de çalıştırır; önce çocuklarınki:
# main.gd
var hero := Hero.new()
add_child(hero) # Health hazır, ardından Hero hazır, hp: 10
print(hero.get_child_count()) # 1Bir üst düğüm, bileşenlerine get_children() (eklenme sırasına göre çocukların bulunduğu bir dizi), get_child_count() ve has_node("Health") ile ulaşır. Ağaçtaki düğümler oyun sona erdiğinde ağaçla birlikte bellekten silinir; bu nedenle add_child() ile eklenen bir bileşenin temizlenmesi gerekmez.
Görev
KolayBileşen düğümlerinden bir robot oluşturun.
Part,Node'u genişletir. Yapıcısı bir parça adı ve güç değeri alır: gücü saklar ve düğümünname'ini parça adı olarak ayarlar. Bir parça sahne ağacına girdiğinde,_ready()Laser attachedyazdırır.Robot,Node'u genişletir.add_part(part_name, power), yeni birPart'ı alt düğüm olarak ekler. Robotun zaten bu ada sahip bir alt düğümü varsaLaser is already attachedyazdırır ve hiçbir şey oluşturmaz.total_power(), tüm parçalarının güçleri toplamını döndürür.
Sağlanan kod robotu sahne ağacına ekler, ardından kaç komut geleceğini okur (add Laser 5, power) ve sonunda parça sayısını yazdırır. add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power komutları için şunu yazdırır:
Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3Kodunuzu part.gd ve robot.gd dosyalarına yazın. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
var robot := Robot.new()
add_child(robot)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "add":
robot.add_part(parts[1], int(parts[2]))
else:
print("Total power: ", robot.total_power())
print("Parts: ", robot.get_child_count())
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt Sistemi8İleri OOP Kavramları
Composition ve Inheritance Karşılaştırmasıİç SınıflarBileşen Olarak DüğümlerRefCounted ve Node KarşılaştırmasıSınıflarda Enum’larKendi başına pratik yap: Online GDScript derleyicisi