Comprendre la Programmation Orientée Objet
Ce tutoriel a été publié en 2013 sur la Petite Fabrique de Jeu Vidéo, le blog qui a permis à 82 internautes débutants de réaliser leur premier jeu vidéo, Rose in the Woods.
La Programmation Orientée Objet, c'est magique !
Récemment, je me suis refait l'intégrale des Harry Potter en film, et j'ai adoré (une petite sorcière de 11 ans vit toujours en moi !). N'empêche, mon regard d'adulte n'a pas pu s'empêcher de remarquer que le système de magie ne semble pas très cohérent. Les films font plein de choix esthétiques, pertinents par rapport au support filmique, mais qui se contredisent les uns les autres.
Bien sûr, on ne regarde pas Harry Potter par logique pure, et ce n'est pas gênant si le système de magie n'est pas rigoureusement cohérent.
N'empêche, je me suis souvent dit que, si la magie existait, ça ressemblerait à de la programmation. Il y aurait un certain nombre de formules, certaines très connues et très utilisées, d'autres plus spécifiques et plus rares. Lancer un sort demanderait une bonne connaissance de la magie et - pour un sort complexe - pas mal de temps et de logique pour être élaboré.
D'ailleurs il y a de nombreuses similitudes entre un programmeur et un sorcier. Les deux ont mauvaise réputation (souvent par ignorance), on ne voit pas leur travail quand il est bien fait, et on les envoie au bûcher quand ils font une erreur !
Je profite donc de cet article pour vous expliquer comment fonctionne la programmation... ou plutôt, la magie !
Et si vous avez un jour rêvé d'entrer à Poudlard, vous allez comprendre pourquoi la programmation est quelque chose de fabuleux.
Invocation de golems
Tout comme il existe plusieurs formes de magie (la magie naturelle, la magie blanche, la magie noire, la nécromancie, etc...), il existe aussi plusieurs formes de programmation.
L'ActionScript 3, le langage utilisé par Flash, est une forme de magie plutôt facile à aborder mais qui n'est pas extrêmement puissante. Entendons-nous bien : vous pouvez faire des choses très poussées avec, mais ce n'est pas avec ça que vous deviendrez le Seigneur des Ténèbres !
L'ActionScript 3 appartient à une famille de magie que l'on appelle la Programmation Orientée Objet. Il s'agit d'une magie d'invocation et d'enchantement. Le principe est simple : au lieu de lancer directement les sorts, vous allez invoquer des objets et créatures enchantés qui, eux, vont agir à votre place.
La formule magique qui permettrait d'invoquer une fée appelée Navi est la suivante :
On peut invoquer tout ce qu'on veut (des loups, des arbres, des citrons...), mais il faut bien sûr, à l'avance, préparer un modèle de l'objet ou de la créature qu'on veut invoquer. Ces "objets" sont donc un peu comme des golems : des êtres artificiels créés à partir de glaise, et qui obéissent à leur créateur.
Enchantement de niveau simple
La magie d'enchantement est une magie à deux temps.
Dans un premier temps, nous allons enchanter notre objet ou créature ainsi créé, c'est-à-dire que nous allons définir ses caractéristiques (c'est ce qu'on appelle des variables : taille, vitesse, puissance de tir, points de vie, agressivité, etc)...
...et lui apprendre des comportements (c'est ce qu'on appelle les fonctions : se déplacer, attaquer, soigner, etc).
Ensuite seulement, une fois que ces comportements sont appris, on peut demander à notre créature de les exécuter à la demande ("Vole !") ou à des moments précis ("Si tu es face à un trou, vole par-dessus"). Certains sorciers sont capables de créer leurs propres sorts, eh bien voilà, nous aussi.
Pour construire notre jeu, j'ai donc invoqué un certain nombre de créatures, que j'ai enchantées pour qu'elles aient un comportement bien précis ! Voici un petit exemple (non exhaustif) des objets et créatures que l'on trouve dans le prototype actuel de Rose in the Woods :
Chacun de ces parchemins, qui comprend toutes les propriétés et tout le comportement d'un élément de jeu, est appelé une classe.
Enchantement de familles
Là où la Programmation Orientée Objet devient fort intéressante, c'est qu'elle permet de définir des familles d'objets qui ont des caractéristiques en commun.
Par exemple, dans notre jeu, nous allons rencontrer un certain nombre d'alliés, les lubiens, qui ont chacun un pouvoir spécial. Je vais donc devoir créer chacun de ces lubiens :
Mais vous remarquerez qu'Akita et ADJ se ressemblent beaucoup, bien qu'ils aient des pouvoirs différents (attaqueBavure() et régénérationHéros()). Après tout, ils ont tous les deux les mêmes caractéristiques (portée, puissance, pointsDeVie, etc...) qui prendront des valeurs différentes, et les mêmes comportements (détecterCible, affecterVie...) à l'exception de leur pouvoir individuel.
Pour éviter de devoir recoder la même chose pour chacun d'entre eux, je vais donc définir qu'ils appartiennent à la même famille : la famille des lubiens. Tous les lubiens hériteront des caractéristiques et des comportements de leur famille, mais chacun aura aussi ses caractéristiques et ses comportements propres !
Et c'est ainsi que je vais pouvoir créer un grand nombre de lubiens différents en relativement peu de temps !