Node sebagai Komponen
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 42 dari 65.
Sebuah Node dapat memiliki node anak. Godot membangun objek game dengan cara ini: node pahlawan mendapat satu node anak untuk setiap kemampuan, seperti kesehatan atau pergerakan. Setiap node anak adalah komponen: node kecil yang melakukan satu tugas.
# 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() menambahkan node sebagai anak. Beri setiap komponen sebuah nama: get_node("Health"), atau bentuk singkatnya $Health, mencari anak dengan nama tersebut. Node tanpa nama, atau yang namanya sudah digunakan oleh node saudara, akan mendapat nama otomatis seperti @Node@4.
_ready() milik sebuah node berjalan saat node tersebut masuk ke pohon scene, yaitu pohon node yang sedang dijalankan oleh game. main.gd berada di dalam pohon tersebut, jadi menambahkan hero ke dalamnya akan menjalankan kedua method _ready(), method milik child terlebih dahulu:
# main.gd
var hero := Hero.new()
add_child(hero) # Health siap, lalu Hero siap, hp: 10
print(hero.get_child_count()) # 1Parent menjangkau komponennya dengan get_children() (array berisi child, sesuai urutan penambahannya), get_child_count(), dan has_node("Health"). Node dalam tree dibebaskan bersama tree saat game berakhir, jadi komponen yang ditambahkan dengan add_child() tidak perlu dibersihkan.
Tantangan
MudahBuat robot dari node komponen.
PartmemperluasNode. Konstruktor menerima nama bagian dan nilai daya: konstruktor menyimpan daya dan menetapkannamenode ke nama bagian. Saat bagian memasuki pohon adegan,_ready()mencetakLaser attached.RobotmemperluasNode.add_part(part_name, power)menambahkanPartbaru sebagai anak. Jika robot sudah memiliki anak dengan nama tersebut, robot mencetakLaser is already attacheddan tidak membuat apa pun.total_power()mengembalikan jumlah daya semua bagiannya.
Kode yang disediakan menambahkan robot ke pohon adegan, membaca jumlah perintah berikutnya (add Laser 5, power), lalu mencetak jumlah bagian di akhir. Untuk add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power, kode mencetak:
Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3Tulis kodemu di part.gd dan robot.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
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())
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online