Nous avons parcouru un long chemin dans ce guide du débutant à la programmation orientée objet, discutant des principes de cohésion, couplage, encapsulation, et abstraction. Dans cet article final, nous discuterons du principe OOP de héritage et ses utilisations dans le développement de jeux.
Remarque: Bien que ce tutoriel ait été écrit en Java, vous devriez pouvoir utiliser les mêmes techniques et concepts dans presque tous les environnements de développement de jeux..
L'héritage est le principe de la hiérarchie des classes. C'est la capacité pour un objet de prendre en charge les états, comportements et fonctionnalités d'un autre objet.
Un exemple concret d'héritage est l'héritage génétique. Nous recevons tous des gènes de nos deux parents qui définissent ensuite qui nous sommes. Nous partageons les qualités de nos deux parents, et pourtant nous sommes différents d'eux.
Les objets en POO peuvent faire la même chose. Les classes parent peuvent avoir des classes enfant (également appelées superclasses et sous-classes, respectivement) qui peuvent avoir les mêmes propriétés que la classe parent et peuvent définir leurs propres états, comportements et fonctionnalités..
A titre d'exemple, considérons la classe suivante qui pourrait être utilisée comme classe parente pour différentes formes:
Classe publique Shape protected int height; protégé int largeur; forme publique (int h, int w) hauteur = h; largeur = w; public int area () return height * width; public int getHeight () return height; public int getWidth () return width; public void setHeight (int h) hauteur de retour; public void setWidth (int w) retour largeur;
Pour étendre cette classe pour implémenter un triangle, cela ressemblerait à ceci:
classe publique Triangle s'étend Shape triangle public (int h, int w) super (h, w); public int area () return super.area () / 2;
Triangle
a tous les mêmes états et fonctionne comme Forme
, mais redéfinit le surface()
fonction pour retourner la zone appropriée d'un Triangle
(mi-temps fois la hauteur).
Le mot clé super
est utilisé pour référencer la super-classe et ses états et fonctions. C'est pourquoi nous pouvons utiliser super()
appeler le constructeur de la superclasse et super.area ()
appeler le surface()
fonction de la superclasse. Donc, dans ce cas, super.area ()
résultats hauteur largeur
.
le protégé
mot-clé est le dernier modificateur de niveau d'accès. Il agit comme le modificateur de niveau d’accès privé mais permet également à toutes les sous-classes d’avoir accès à la variable ou à la fonction..
Comme vous pouvez le constater, l'héritage peut grandement réduire la redondance de code entre des objets similaires en prenant ce que ces objets ont en commun et en les plaçant au même endroit. Cela crée également un code plus facile à gérer, car cela permet de respecter le principe de DRY et d'empêcher l'effet d'entraînement des modifications de code..
Si tout cela vous semble familier, c'est probablement parce que l'abstraction avait des avantages très similaires (ainsi que la plupart des autres principes de la programmation orientée objet). L'abstraction est étroitement liée à l'héritage, car une classe abstraite peut être utilisée comme superclasse pour créer des sous-classes. La seule différence entre une classe abstraite et une classe normale est qu’une classe abstraite ne peut pas être utilisée pour créer un objet..
Revenons une fois de plus à nos trois jeux pour décrire comment appliquer l’héritage..
Rappelons que nous avons défini une classe abstraite pour déplacer des objets sur un écran. Rappelons également que nous avons défini un Navire
classe pour l'objet navire. Pour appliquer l'héritage aux astéroïdes, nous pouvons avoir le Navire
classe étendre la Mobile
classe comme suit:
/ ** * La classe de navire * / la classe publique Le vaisseau s'étend Mobile / ** * Fonction permettant de faire pivoter le navire * / public void rotation () // Code qui fait tourner le navire / ** * Fonction de mise à feu * / public void fire () // Code à tirer
Le code nécessaire pour déplacer le navire est pris en charge dans le Mobile
classe abstraite, afin que nous puissions l'enlever de la Navire
classe. Tous les autres objets pour astéroïdes pourraient également hériter de la Mobile
classe, ce qui rend extrêmement facile de changer la façon de déplacer un objet.
Une chose à noter à propos de l'héritage est la possibilité d'avoir plusieurs héritages, ou la capacité d'une classe à hériter de plusieurs classes en même temps. Certaines langues le permettent, d'autres pas.
Java est l'un des langages qui n'autorisent pas l'héritage multiple. Par conséquent, vous ne pouvez pas avoir l'objet Ship hériter à la fois d'un Mobile
classe et un Drawable
classe.
L’héritage peut être appliqué à Tetris en faisant en sorte que le Tetrimino et tous les visuels du jeu héritent de la Drawable
classe, que nous avons définie dans le dernier article.
Rappelez-vous que pour Pac-Man, nous avons identifié vos objets: Pac-Man, un fantôme et un pac-point. Tout au long de cette série, nous n’avons discuté que de ces trois objets et avons différé de mentionner le dernier élément critique de Pac-Man: la pastille énergétique. Avec l'héritage, nous sommes maintenant prêts à en parler.
Une pastille de puissance est un pac-dot spécial qui permet à Pac-Man de manger des fantômes. Ses états et comportements sont exactement les mêmes que ceux d’un pac-point, la seule différence étant sa taille et sa capacité à clignoter (rappelez-vous que pour que le jeu reste couplé de manière lâche, nous voulons qu’une autre classe surveille le moment où un pellet est mangé et active le changeState ()
méthode des fantômes). C'est là que l'héritage devient pratique.
Puisqu'une pastille pac-dot et power est pratiquement le même objet, nous pouvons créer un PowerPellet
classe qui étend la PacDot
classe. le PowerPellet
Il suffirait à la classe de modifier quelques états pour la rendre plus grande et d’ajouter le comportement de croissance et de contraction pour créer un effet clignotant. Et c'est tout - nous avons maintenant une pastille électrique avec peu de travail supplémentaire. Pas trop mal.
Le code de ce à quoi cela pourrait ressembler pourrait être le suivant:
/ ** * La classe Pac-dot * / la classe publique PacDot s'étend Drawable protected int size; protégé int score; public PacDot () taille = 10; score = 10; / ** * Renvoie la valeur du point pac à ajouter au score du joueur lorsqu'il est consommé * / public int getScore () return score; / ** * Retourne la taille du pac-dot * / public int getSize () return size; / ** * Classe Power Pellet * / classe publique PowerPellet étend PacDot private int sizeModifier; // n'a pas besoin de définir la taille et le score car ils sont // déjà définis dans PacDot - PowerPellet les hérite. PowerPellet public () taille = 20; score = 50; sizeModifier = -2; / ** * La fonction de clignotement qui serait appelée à chaque fois que la pastille de puissance * est tirée. Modifie sizeModifier pour simuler un effet de clignotement * / public void blink () size + = sizeModifier; si (taille < 10 || size > 20) sizeModifier = -sizeModifier;Il est intéressant de noter que pour aider à garder une trace de toutes nos classes et de notre héritage de classes pour Pac-Man, vous pouvez utiliser un diagramme de classes pour voir comment tout est lié..
L'héritage est très utile pour créer du code plus facilement maintenable, car il nous permet de créer des objets similaires sans dupliquer le code entre eux. Il est également utile de créer du code organisé en affichant la hiérarchie des classes..
Et c'est tout! Nous avons maintenant terminé la série OOP ici sur Gamedevtuts +. J'espère que vous avez apprécié ces articles et qu'ils vous ont aidé à mieux comprendre comment les principes de la POO peuvent être appliqués au développement de jeux. Assurez-vous de nous suivre sur Twitter, Facebook ou Google+ pour vous tenir au courant des derniers messages..