Menu
CoddyTech

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())   # 1

Parent 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.

challenge icon

Tantangan

Mudah

Buat robot dari node komponen.

  • Part memperluas Node. Konstruktor menerima nama bagian dan nilai daya: konstruktor menyimpan daya dan menetapkan name node ke nama bagian. Saat bagian memasuki pohon adegan, _ready() mencetak Laser attached.
  • Robot memperluas Node. add_part(part_name, power) menambahkan Part baru sebagai anak. Jika robot sudah memiliki anak dengan nama tersebut, robot mencetak Laser is already attached dan 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: 3

Tulis 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())
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online