La programmation orienté objet :
Dans ces mots obscures se cachent un concept magique et assez simple à comprendre.
L'objet, il faut le prendre au sens premier du terme, à savoir une chose.
Comme dans la vraie vie, ce qui défini un objet, par exemple une chaise, sont ces fonctionnalités, représentées par les fonctions, et ces propriétés, représentés par des variables.
On comprend donc que d'un point de vu programmation, un objet est un conteneur, il peut contenir des variables, des fonctions ( et aussi d'autres objets, rien n’empêche un conteneur de contenir un autre conteneur )
Un concept très important en orienté objet, c'est ce qu'on appelle l'encapsulation.
En principe, ca sert à "cacher" ce qu'il y a dans un objet. Dans gamemaker, on peut presque dire que ca n'existe pas.
Un exemple tout bête avec la chaise, tu n'as pas besoin d'avoir la notice d'utilisation qui décrit étape par étape comment s'assoir. Tu vas juste utiliser cette fonctionnalité.
En orienté objet, on va faire pareil, tu te fout de savoir comment fonctionne la fonction "assoir", tu veux juste l'utiliser.
Reprenons l'exemple de la chaise.
On va commencer par qqc de simple, à savoir ces propriétés.
La chaise la plus simple se décrit de cette manière :
-4 pieds
-un dossier
-une surface
-sert à s'assoir
En programmation on obtiendra donc :
En ajoutant la fonctionnalité s'assoir :
Il va sans dire que, il faut aller regarder le code de l'objet chaise si on veut voir comment ca fonctionne.
On aurait un truc du genre :
Code : Tout sélectionner
chaise
{
pieds=4;
dossier=1;
surface=1;
fonction_assoir()
{
Tant que ( fesse pas toucher surface )
{ plier les genoux et baisser les fesses }
}
}
Là, tu vas me poser la question, oui mais comment je fais tout ca dans gamemaker ?
Gamemaker te simplifie la vie, parce que la programmation orienté objet, c'est bien plus étendu que ca...
Déjà, tu as vu avec les variables ( le premier conteneur que tu as connu ) qu'il fallait les créer et les initialiser.
Pareil pour les objets. Admettons, tu créés un objet chaise dans les ressources de gamemaker. Tu le mets dans une room. Au moment du lancement du jeu, tu as plusieurs évènements qui se passent. On va s'intéresser à ce qui se passe pour l'objet.
Donc la room se créé, s'initialise, ensuite, ton objet est créé dans la room. Et là, tu as un premier évènement qui s'appelle CREATE.
Si tu lance ton projet en mode debug, tu peux aller consulter le visualiseur d'objet et rentrer son "numéro de série" ( si tu lui as mis un sprite, suffit de pointer dessus ta souris pour avoir le numéro en bas à gauche ).
Et là tu devrais voir tout un tas de trucs. Gamemaker initialise tout un tas de trucs de base pour ton objet, et tous les objets sont créés avec ces valeurs.
Create, c'est à cette étape que tu vas initialiser les variables dont tu as besoin pour ton objet. Toutes les variables dont tu as besoin pour que l'objet fonctionne ( et uniquement cet objet ), tu vas les mettre dans un script et les initialiser. Tu as ensuite lier ce script à l'évènement CREATE.
Tu sauvegardes, et tu lances en mode debug, tu regardes à nouveau les propriétés de ton objet, et tu vas voir que les variables que tu as mis dans ton script son apparues !
Je ne pense pas avoir besoin de t'expliquer les events ( y a quelques cas particuliers si jamais tu as des problèmes je les expliquerais si tu penses faire face à un bug ).
Si jamais tu as besoin d'interagir avec un autre objet... Par exemple pour connaitre la distance entre l'objet "fesse" et "chaise" pour savoir si tu dois continuer à baisser l'objet "fesse" pour toucher l'objet "chaisse" on utilise le point entre le nom de l'objet et l'élément de l'objet qui nous intéresse. Ca peut etre une variable comme une fonction.
Exemple :
On accède à l'attribut "gauche de l'objet fesse". Et d'après le contexte, tu comprends que "gauche" est une variable de l'objet "fesse".
On a donc les objets "fesse" et "chaise" décris comme ceci :
Code : Tout sélectionner
Chaise
{
coord_x;
coord_y;
pieds;
surface;
dossier;
occupé;
}
La fonction/script assoir contiendrait un code du genre :
Code : Tout sélectionner
Assoir
{
Tant que ( coord_x > Chaise.coord_x ET coord_y > Chaise.coord_y ) //cette ligne contient un mot clé important
{
baisser coord_x;
baisser coord_y;
}
}
Le mot clé important ( le mot ET ) dans ce bout de code s'appelle une opération logique. C'est utile quand on veut ajouter des "vérités" dans les boucle ou les conditions. Ca sera détaillé plus tard.
Ce script est exécuté pendant l'event "step" de l'objet "fesse", comme ca, à chaque frame, il va mettre les coordonnées X et Y de l'objet Fesse en mouvement. Tu vas me demander pourquoi on met pas Fesse.coord_y ?
Parce que c'est l'objet Fesse qui "execute le script" ( c'est plus ou moins faux mais ca permet de mieux comprendre ). Dès que tu as besoin d'information sur un objet qui n'est pas celui qui "exécute le script", tu as besoin d'utiliser cette forme :
Si tu as besoin d'utiliser une fonctions ou un script d'un autre objet, c'est la même chose, tu appelles l'objet par son ID ou son nom ( il est préférable d'utiliser le numéro d'ID plutot que le nom d'un objet quand tu as plusieurs fois le meme objet dans la scène courante ) et tu appelles la fonction : objet.fonction(paramètres)
Il faut faire TRES attention à ce que l'on fait quand on utilise ce genre de mécanisme. Dans d'autres langages, on passe par ce que l'on appelle des accesseurs ( des fonctions dédiées à aller chercher ou modifier les infos d'un objet ). Tu comprends que pouvoir lire et modifier les informations de manière directe dans un objet peut engendrer des bugs.
Il n'empêche que c'est bien pratique dans certaines situations.
On a aussi des notions d'objet "parent" et "fils", pareil pas très compliqué à comprendre... Le terme dédié s'appelle l'héritage. Tu comprends très facilement que le "fils" d'un objet "hérite" de tout ce que son "père" possédait ( variables et fonctions ), on pourrait parler de clônes, mais ce n'est pas exact. Parce qu'il est possible à la création d'un objet "fils" de modifier son "code génétique" ( variables et fonctions ).
Mais ca, tu n'en auras une utilité que sur des jeux un minimum complexe. ( dans le cas d'un shoot, si tu veux faire un boss à parties multiples plus ou moins indépendantes, ca devient quasi nécessaire pour simplifier la gestion du truc ).
Je m'arrête là, si tu as des questions, hésite pas !
Sinon, je vais ptete passer à la version studio ( en MAJ ca me coute 10€ donc je peux me le permettre ), j'ai ptete moyen de récupérer une vieille version de mon tuto format PDF et repartir de là, et comme j'aime beaucoup faire des vidéos, ptete en faire un tuto vidéo ! Faut d'abord que j'aille fouiller mon ancien disque dur que j'ai conservé...