Menu
CoddyTech

Sınıflarda Enum’lar

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 44 / 65.

Bir enum, değişkenlerinin yanında bir sınıfın içinde tanımlanabilir. Seçenekler daha sonra o sınıfa ait olur:

# weapon.gd
class_name Weapon
extends RefCounted

enum Kind { SWORD, BOW, STAFF }

var kind: Kind

func _init(weapon_kind: Kind) -> void:
	kind = weapon_kind

func is_ranged() -> bool:
	return kind == Kind.BOW or kind == Kind.STAFF

weapon.gd içinde enum Kind şeklindedir. Diğer tüm dosyalarda değerlerde, tür açıklamalarında ve match kalıplarında önce sınıf adı yazılır: Weapon.Kind.BOW:

# blacksmith.gd
class_name Blacksmith
extends RefCounted

static func repair_cost(kind: Weapon.Kind) -> int:
	match kind:
		Weapon.Kind.SWORD:
			return 20
		Weapon.Kind.BOW:
			return 15
	return 30

Seçenekler hâlâ sayıdır: Weapon.new(Weapon.Kind.BOW).kind, 1 yazdırır. Enum'un kendisi, adlardan sayılara eşleme yapan bir sözlük gibi çalışır:

print(Weapon.Kind.keys())       # ["SWORD", "BOW", "STAFF"]
print(Weapon.Kind.find_key(1))  # BOW
print(Weapon.Kind["STAFF"])     # 2
print(Weapon.Kind.size())       # 3
for kind in Weapon.Kind.values():
	print(Weapon.Kind.find_key(kind), ": ", Blacksmith.repair_cost(kind))

Döngü SWORD: 20, BOW: 15 ve STAFF: 30 değerlerini yazdırır. GDScript, bir sayının seçeneklerden biri olup olmadığını kontrol etmez: Weapon.new(7), kind değeri 7 olan bir silah oluşturur. Adlandırılmış seçenekleri aktarın, kod doğru kalır.

Bir sınıfı tanımlayan enum o sınıfın içinde yer alır; böylece okuyucu Weapon.Kind.BOW ifadesindeki Kind'in nereden geldiğini görür.

challenge icon

Görev

Kolay

İksirleri, Potion sınıfında bulunan bir enum ile sırala.

  • potion.gd içinde enum Kind { HEAL, MANA, POISON } tanımla ve kind değişkenine Kind türünü ver.
  • Potion.from_text(text, strength), "MANA" değerini Kind.MANA değerine dönüştüren ve yeni bir iksir döndüren statik bir fonksiyondur.
  • describe(), türün adını ve gücünü kullanarak HEAL potion: +20 HP, MANA potion: +15 MP veya POISON potion: -5 HP döndürür.
  • belt.gd içinde summary(), enum sırasına göre her tür için bir satır döndürür: HEAL: 2 (35 total). Satırda o türden kaç iksir olduğu ve parantez içinde güçlerinin toplamı yer alır. İksiri olmayan türler için de bir satır bulunur.

Verilen kod, kaç iksir geleceğini okur (HEAL 20), her birini kuşağa ekler, açıklamasını ve ardından özeti yazdırır. HEAL 20, POISON 5, HEAL 15 için şu çıktıyı verir:

Added HEAL potion: +20 HP
Added POISON potion: -5 HP
Added HEAL potion: +15 HP
HEAL: 2 (35 total)
MANA: 0 (0 total)
POISON: 1 (5 total)

Kodunu potion.gd ve belt.gd dosyalarına yaz. main.gd, verilen 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 belt := Belt.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var potion := Potion.from_text(parts[0], int(parts[1]))
		belt.add(potion)
		print("Added ", potion.describe())
	for line in belt.summary():
		print(line)
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