Oyun Karakteri Geliştirme
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 64 / 65.
Görev
OrtaBir rol yapma oyununun karakterlerini oluştur: soyut bir Character, onu genişleten üç sınıf ve karakterlerin öğrendiği yetenekler.
character.gd dosyasındaki Character, bir @abstract sınıfıdır:
- Özellikler:
character_name(yapıcıdan alınır),level1,max_healthvehealth100.0,max_manavemana50,strength,intelligenceveagility10,defense5ve birArray[Ability]olanabilities. Sağlık değerlerifloat, diğer istatistiklerinttüründedir. defeated(character_name: String)sinyali.class_title() -> Stringveattack_power() -> floatsoyut metotları.level_up() -> String: seviye+1, maksimum sağlık+10, maksimum mana+5, güç, zekâ, çeviklik ve savunma+1artar; sağlık ve mana maksimum değerlerine doldurulur.NAME reached level N!döndürür.attack(target):NAME attacks TARGETyazdırır, ardındantarget.take_damage(attack_power())değerini döndürür.take_damage(amount) -> float: hasaramount - defense * 0.5kadardır, ancak en az1.0olur; sağlık bu miktar kadar azalır ve asla0.0değerinin altına düşmez. Her değeri bir ondalık basamaklaNAME takes D damage (HP H)yazdırır, bu darbe sağlığı0değerine düşürdüğündedefeatedsinyalini gönderir ve hasarı döndürür.is_alive(): sağlık0değerinden büyükse.learn_ability(ability), yeteneğiabilitieslistesine ekler.use_ability(index, target) -> float: dizinabilitiessınırlarının dışındaysaNAME has no ability INDEXyazdırır ve0.0döndürür; aksi takdirde yeteneğinuse()metodunun döndürdüğü değeri döndürür._to_string():NAME the TITLE (level L): HP H/MAX, mana M/MAX, STR S, INT I, AGI A, DEF D; sağlık değeri bir ondalık basamakla gösterilir.
Her alt sınıf üst sınıfın yapıcısını çağırır, ardından kendi başlangıç istatistiklerini ayarlar (diğerleri temel sınıftaki değerlerde kalır), class_title() metodundan sınıf adını döndürür ve level_up() metodunu super() kullanarak geçersiz kılar:
Warrior: sağlık150.0, mana30, güç15, zekâ5, savunma8; saldırı gücüstrength * 1.2; seviye atladığında ayrıca güç+2ve maksimum sağlık+10artar (sağlık doldurulur).Mage: sağlık80.0, mana150, güç5, zekâ20, savunma3; saldırı gücüintelligence * 0.4; normal bir saldırıdan sonra5mana geri kazanır (maksimum değeri aşmaz); seviye atladığında ayrıca zekâ+2ve maksimum mana+15artar (mana doldurulur).Rogue: sağlık100.0, mana60, güç12, zekâ8, çeviklik18, savunma4; saldırı gücüstrength * 0.5 + agility * 0.7; seviye atladığında ayrıca çeviklik+2artar.
ability.gd dosyasındaki Ability: yapıcı ability_name, mana_cost (int) ve damage (float) değerlerini alır. use(user, target) -> float, kullanıcının manası maliyetin altındaysa USER does not have enough mana for ABILITY yazdırır ve 0.0 döndürür. Aksi takdirde manayı harcar, USER casts ABILITY on TARGET yazdırır ve target.take_damage(damage + user.intelligence * 0.5) değerini döndürür.
Verilen kod her karakterin defeated sinyaline bağlanır ve NAME is defeated! yazdırır. Bu girdi için:
hero warrior|Aragorn
hero rogue|Orc
attack Aragorn|Orc
attack Orc|Aragorn
level Aragorn
status Aragornçıktı şöyledir:
Aragorn attacks Orc
Orc takes 16.0 damage (HP 84.0)
Orc attacks Aragorn
Aragorn takes 14.6 damage (HP 135.4)
Aragorn reached level 2!
Aragorn the Warrior (level 2): HP 170.0/170.0, mana 35/35, STR 18, INT 6, AGI 11, DEF 9Kodunu character.gd, warrior.gd, mage.gd, rogue.gd ve ability.gd dosyalarına yaz. main.gd, verilen girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
var heroes := {}
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"hero":
var hero: Character
match f[0]:
"warrior":
hero = Warrior.new(f[1])
"mage":
hero = Mage.new(f[1])
"rogue":
hero = Rogue.new(f[1])
hero.defeated.connect(func(who): print(who, " is defeated!"))
heroes[f[1]] = hero
"learn":
heroes[f[0]].learn_ability(Ability.new(f[1], int(f[2]), float(f[3])))
"attack":
heroes[f[0]].attack(heroes[f[1]])
"cast":
heroes[f[0]].use_ability(int(f[1]), heroes[f[2]])
"level":
print(heroes[f[0]].level_up())
"status":
print(heroes[f[0]])
line = OS.read_string_from_stdin()
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 SistemiKendi başına pratik yap: Online GDScript derleyicisi