Menu
CoddyTech

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

Bir ü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.

challenge icon

Görev

Kolay

Bileş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ün name'ini parça adı olarak ayarlar. Bir parça sahne ağacına girdiğinde, _ready() Laser attached yazdırır.
  • Robot, Node'u genişletir. add_part(part_name, power), yeni bir Part'ı alt düğüm olarak ekler. Robotun zaten bu ada sahip bir alt düğümü varsa Laser is already attached yazdı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: 3

Kodunuzu 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())
quiz iconKendini test et

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

Kendi başına pratik yap: Online GDScript derleyicisi