Développement d’un personnage de jeu
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 64 sur 65.
Défi
MoyenCréez les personnages d’un jeu de rôle : une classe abstraite Character, trois classes qui en héritent et les capacités que les personnages apprennent.
Character dans character.gd est une classe @abstract :
- Propriétés :
character_name(issu du constructeur),level1,max_healthethealth100.0,max_manaetmana50,strength,intelligenceetagility10,defense5, ainsi queabilities, unArray[Ability]. Les valeurs de santé sont desfloat, les autres statistiques desint. - Un signal
defeated(character_name: String). - Méthodes abstraites
class_title() -> Stringetattack_power() -> float. level_up() -> String: niveau+1, santé maximale+10, mana maximale+5, force, intelligence, agilité et défense+1; la santé et le mana sont rétablis à leur maximum. RenvoieNAME reached level N!.attack(target): afficheNAME attacks TARGET, puis renvoietarget.take_damage(attack_power()).take_damage(amount) -> float: les dégâts sont deamount - defense * 0.5, avec un minimum de1.0; la santé diminue de cette valeur et ne descend jamais en dessous de0.0. AfficheNAME takes D damage (HP H)avec une décimale pour chaque valeur, émet le signaldefeatedlorsque cette attaque fait tomber la santé à0et renvoie les dégâts.is_alive(): la santé est supérieure à0.learn_ability(ability)ajoute la capacité àabilities.use_ability(index, target) -> float: si l’index est en dehors deabilities, afficheNAME has no ability INDEXet renvoie0.0; sinon, renvoie la valeur renvoyée paruse()de la capacité._to_string():NAME the TITLE (level L): HP H/MAX, mana M/MAX, STR S, INT I, AGI A, DEF D, avec une décimale pour la santé.
Chaque sous-classe appelle le constructeur parent, puis définit ses propres statistiques de départ (les autres conservent les valeurs de base), renvoie son nom de classe depuis class_title() et redéfinit level_up() avec super() :
Warrior: santé150.0, mana30, force15, intelligence5, défense8; puissance d’attaquestrength * 1.2; lors de la montée de niveau, gagne aussi+2en force et+10en santé maximale (santé rétablie).Mage: santé80.0, mana150, force5, intelligence20, défense3; puissance d’attaqueintelligence * 0.4; après une attaque normale, récupère5points de mana (sans dépasser le maximum) ; lors de la montée de niveau, gagne aussi+2en intelligence et+15en mana maximale (mana rétabli).Rogue: santé100.0, mana60, force12, intelligence8, agilité18, défense4; puissance d’attaquestrength * 0.5 + agility * 0.7; lors de la montée de niveau, gagne aussi+2en agilité.
Ability dans ability.gd : le constructeur prend ability_name, mana_cost (int) et damage (float). use(user, target) -> float affiche USER does not have enough mana for ABILITY et renvoie 0.0 lorsque le mana de l’utilisateur est inférieur au coût. Sinon, il dépense le mana, affiche USER casts ABILITY on TARGET et renvoie target.take_damage(damage + user.intelligence * 0.5).
Le code fourni se connecte au signal defeated de chaque personnage et affiche NAME is defeated!. Pour cette entrée :
hero warrior|Aragorn
hero rogue|Orc
attack Aragorn|Orc
attack Orc|Aragorn
level Aragorn
status Aragornla sortie est :
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 9Votre code doit se trouver dans character.gd, warrior.gd, mage.gd, rogue.gd et ability.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d'entrée/sortie fourni : ne le modifiez pas
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()
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy12Défis finaux
Plateforme d’apprentissage en ligneSystème bancaireDéveloppement d’un personnage de jeuService de location de véhiculesEntraînez-vous par vous-même : Compilateur GDScript en ligne