Entités - HelmDefense/HelmDefense GitHub Wiki
La hiérarchie des entités
Présentation générale
Les entités (représentées par la classe abstraite Entity
) sont tous les éléments qui peuvent se tenir sur le terrain et interagir avec. Cet ensemble est découpé en deux sous-parties : les entités vivantes (LivingEntity
) et les projectiles (Projectile
). Pour représenter l'ensemble des entités, nous avons décidé de ne pas avoir un ensemble de classes héritant des classes que nous avons actuellement, mais plutôt de donner un type d'entité (EntityType
) en attribut de ces classes. Ainsi, un simple Guerrier Humain et Saroumane sont deux entités de type LivingEntity
ayant simplement de différent à la création leur type d'entité. Ces types d'entités sont subdivisés en deux sous-types : les types d'entités vivantes (LivingEntityType
) et les types de projectiles (ProjectileType
). Ce sont des énumérations qui regroupent les caractéristiques des entités de leur type.
Entity
Présentation
Cette classe est la base de tout ce qui concerne les entités. Elle possède énormément d'attributs que ses enfants peuvent exploiter, allant du plus général (le type d'entité) au plus particulier (liste de modificateurs d'attribut), dans le but de simplifier au maximum la définition de sous-classes ajoutant des caractéristiques.
EntityType
Cette interface est implémentée par les deux énumérations de type d'entités, et apporte des accesseurs et des mutateurs sur les données associées, ainsi que des méthodes statiques permettant la récupération d'un type à partir d'une donnée.
LivingEntity
et Projectile
Les classes concrètes Ces deux classes héritent donc de Entity
et profitent de sa complétude (Location
, Hitbox
, AttributeModifier
, Level
, etc...) pour apporter leurs caractéristiques le plus simplement possible.
LivingEntity
Présentation
L'idée derrière cette classe est d'apporter un notion de points de vie, et la possibilité de mourir (bien que la notion d'existence soit déjà gérée par la classe Entity
étant donné que les projectiles peuvent aussi disparaitre). Elle possède également une notion de bouclier, qui peut encaisser des dégâts ou être ignoré. Les entités vivantes peuvent enfin avoir plusieurs "états" matérialisés par leurs flags
.
DamageCause
Il existe également à travers l'une des méthodes de cette classe une notion de DamageCause
(celle de Damageable
étant déjà représentée par la classe LivingEntity
elle-même) qui sont simplement les entités et les causes externes, dont deux sont définies dans cette classe.
Excepté la classe Entity
, toutes ces sources de dégâts sont des singletons. On ne peut donc pas les instancier et leur instance se récupère via la méthode statique getInstance()
.
Entity
(DamageCause
)
La classe Entity
implémente l'interface DamageCause
, étant donné que toutes les entités peuvent attaquer (certaines n'infligent aucun dégât, mais peuvent tout de même attaquer et déclencher leurs capacités d'attaque, comme la Tour du Mordor).
TickDamageCause
Cette classe est définie dans LivingEntity
et est un singleton. En effet, il n'existe qu'une seule instance capable d'attaquer, infligeant des dégâts fixes. Ceci est plus à but informatif pour la victime (elle peut savoir si les dégâts qu'elle a subit sont des dégâts directs ou des dégâts de feu ou de poison par exemple).
DispawnDamageCause
Cette classe est très similaire à TickDamageCause
. Définie également dans LivingEntity
et comme singleton, elle dénote les dégâts (mortels) découlant de la disparition d'une entité (lorsque le niveau est arrêté ou que l'unité est vendue par exemple). L'attaque de son unique instance ignore le bouclier de sa cible et inflige autant de dégât qu'elle a de vie, tuant ainsi à 100% de chance.
EndDamageCause
Cette classe (similaire aux deux précédente) est définie dans Level
et représente les dégâts dus au fait que l'unité attaquante a atteint la fin du niveau et doit ainsi disparaître. Tout comme la DispawnDamageCause
, son attaque est mortelle à 100%.
LivingEntityType
Présentation
Cette énumération (qui implémente EntityType
) liste toutes les entités vivantes de notre jeu. Chaque type d'entité possède un camp (EntitySide
) et un sous-type (SubType
, défini dans l'énumération). De plus, ils ont des données qui sont chargées depuis le fichier game_data/entities.yml
dans la méthode YAMLLoader.loadEntityData();
EntitySide
Cette énumération est très simple, et ne contient que deux valeurs : ATTACKER
& DEFENDER
. Ces valeurs déterminent la nature première d'une entité, et la méthode isEnemy()
va les comparer (deux unités de camp différents sont ennemies, sinon alliées).
SubType
(LivingEntityType
)
Ce sont les sous-types possibles pour les entités vivantes. Ces valeurs déterminent le caractère de l'entité, et son rôle. Les valeurs sont : CLASSIC
(entités lambda), SPECIAL
(entité particulières comme les portes), HERO
& BOSS
.
Les entités vivantes spéciales
Il existe deux sous-classes qui héritent de LivingEntity
: Hero
& Door
. Ces classes sont particulières car elles apportent des comportements supplémentaires à ces deux entités.
Hero
Les héros sont définis à travers cette classe, qui gère la notion d'amélioration des statistiques, d'utilisation de pouvoir spécial, et de réapparition au bout d'un certain temps après la mort.
Door
Les portes ont de particulier leur capacité à bloquer physiquement leur ennemis ainsi que d'avoir des points de vie au cas par cas.
Projectile
Présentation
Cette classe représente les projectiles, de manière globale. Ils sont définis avec un type, une source LivingEntity
, une Location
cible, une vitesse et éventuellement un angle de déviation.
ProjectileType
Ce sont les différents types de projectiles qui existent. Mis à part leur données, les types sont complètement vierges et leur réelle spécification dépend de leur source.
La hiérarchie en image
Voici le diagramme de classe correspondant à cette hiérarchie complète :