Archives par mot-clé : objets

Programmation orientée objet & Générateur de Particules

La programmation orientée objet est l’une des bases de programmation moderne et se retrouve dans un grand nombre de langages de programmation. Elle permet de créer des « objets » mais aussi de nous simplifier grandement la vie.

Prenons un sketch simple de 200*200 dans lequel nous souhaitons dessiner une balle se déplaçant à une vitesse aléatoire et rebondissant sur les bords de notre scène. Nous écrirons :

ixd_classe_00-01

Mais que ce passe-t-il si nous voulons non plus une balle mais 10, 40 ou 100?
La première solution consisterait à créer autant de variables que nous avons de balles mais cela n’est pas envisageable. Notre code dépassera de loin le nombre de page de la constitution américaine et nous serons vite perdu.
La seconde solution serait d’utiliser des tableaux pour stocker chacune de nos variables mais là aussi nous allons avoir de nombreux tableaux et cela n’est toujours pas envisageable.
C’est là que la programmation orientée objet entre en jeux. Elle va nous permettre de créer aisément nos 10, 40 ou 100 balles en un minimum de temps.

Qu’est ce qu’un objet?

Un objet est directement inspiré du monde réel. En effet nous sommes entouré d’objets et chacun de ces objets à des propriétés propres. Par exemple nous avons les objets « téléphones ». Chacun de ses objets « téléphones » sont définis par le fait qu’ils ont tous des variables communes, à savoir le fait de pouvoir passer des communications vocales par le biais d’un réseau téléphonique. Mais ils possèdent aussi des variables qui leur sont propre comme le fait de pouvoir envoyer des sms ou non, d’être tactile ou pas, d’avoir des poids et des tailles qui diffèrent… Bref nos téléphones sont des objets appartenant à une même classe, la classe « Téléphone ».

Revenons maintenant à notre skecth, nous avons imaginé avoir un espace de 200*200 dans lequel des balles de tailles différentes se déplacent à des vitesses différentes. Nous avons donc des « objets » qui ont un comportement commun, à savoir le fait d’être des balles et de se déplacer, mais aussi différents puisque leur vitesses diffèrent. Nous avons l’exemple parfait pour créer une « classe » d’objets.

Notre première classe.

Précédemment nous avons parlé de « classe » sans même l’expliquer. Une classe est une matrice, un patron, un plan de construction… d’un objet. La classe d’un objet permet de créer et d’instancier les variables communes à tous nos objet, de développer leur comportements et de créer la méthode de construction de notre objet. D’un point de vu développement, elle est assez proche de la façon dont nous construisons un sketch.

Lorsque nous créons nos sketchs nous avons l’habitude de créer des variables, puis une méthode setup() qui nous permettra de créer notre sketch (taille, moteur de rendu…) et enfin une méthode draw() (notre boucle). Lorsque nous créons une classe nous obtenons à peu de choses près la même syntaxe :

Entrons maintenant dans le vif du sujet en créant notre classe « Balle ». Pour cela nous allons reprendre l’ensemble de nos variables, nous les initialiserons dans notre constructeur et enfin nous dessinerons notre balle dans une méthode display(). Cela nous donne donc :

Nous venons d’écrire notre classe mais comme nous avons vu, il s’agit ici de la matrice qui nous permettra de créer nos objets.
Il nous faut maintenant créer nos objets et les instancier pour ensuite les afficher sur la scène. Dans notre sketch, nous allons créer un nouvel objet « maBalle » faisant partie de la classe « Balle ».

Dans notre setup() nous instancierons notre objet.

Enfin dans notre draw, nous appellerons la méthode display() de notre balle

Cela nous donne donc

ixd_classe_00-01

On remarque que pour appeler une méthode de notre classe nous procédons de la manière suivante objet.methode(). Il en va de même pour accéder aux variables. Ainsi println(maBalle.x) me renverra la valeur x de ma balle. On peut par la suite aisément modifier ces valeurs.

On avait pas parlé de plusieurs balles?

Nous venons de créer notre première classe mais nous obtenons 1 balle et non 100 comme promis précédemment. Pour cela rien de plus simple, et c’est là le grand pouvoir des classes, il nous suffit de créer un tableau d’objets et non plus un seul objet.

ixd_classe_02

Allons plus loin dans la possibilité qu’offrent les classes.

Nous savons maintenant comment créer une classe et instancier des objets mais allons plus loin dans les possibilités que nous offre la programmation orientée objet. Nous venons de créer 100 objets mais que ce passe-t-il dans le cas où nous voulions en créer à chaque clic?
Il faudrait que nous rajoutions des éléments à notre tableau.

Imaginons un sketch simple, de 400*200 dans lequel nous pourrions rajouter une balle à chaque clic dont la position de départ sera définie par la position de la souris.

Pour cela nous allons toujours utiliser un tableau mais d’un autre type puisque nous utiliserons un ArrayList(). À l’inverse d’un tableau classique maBalle[] qui possède une taille fixe, les ArrayList sont des tableaux dont la taille n’est pas définie et peut être en constante expansion. Cependant sa déclaration diffère d’un tableau classique. Ainsi pour passer notre classe balle en ArrayList pour devrons changer notre code comme il suit :

De même la methode nous permettant d’ajouter des balles sur notre scène diffère d’un tableau classique

Afin la dernière différence avec le tableau classique est la façon nous nous parcourons notre ArrayList afin d’appeler la méthode display() de notre classe.

Maintenant que nous avons vu comment créer et parcourir un ArrayList, il ne nous reste plus qu’à modifier notre code précédent afin de créer nos balles à chaque clic de la souris

Le résultat est là mais cependant il nous manque une règle à respecter. Nous voulions que nos balles apparaissent à la position de la souris, hors pour le moment elle apparaissent à des positions aléatoire. En effet lorsque l’on retourne dans le constructeur de la classe nous remarquons que notre x et y sont définies de manière aléatoire.

Nous pourrions changer cela par un mouseX mouseY mais en faisant cela nos 10 première balles présentes sur scène auront le même point d’origine. Nous allons donc légèrement changer notre constructeur en lui indiquant qu’à son appel il devra recevoir des variables. Nous pourrons alors par la suite définir aisément la position de chacune de nos balles à la création.

Il nous faudra alors changer la façon dont nous instancions nos balles comme il suit

Nous avons maintenant un tableau dynamique (ArrayList) et nous créons autant de balles que nous voulons.
Ajoutons maintenant une dernière possibilité, à savoir fixer une limite à notre tableau dynamique. En effet cela nous permettra d’économiser notre ordinateur qui risquerait, au bout d’un millions de particules, de ralentir.

Pour cela nous rajoutons une condition permettant de supprimer la première balle (la plus vieille) créée lorsque nous atteignons un maximum de 30 balles

Nous voila donc avec notre première classe de particules.

ixd_classe_03

Nous venons de voir comment créer et utiliser des objets pour créer un premier générateur de particules. Cependant nous pouvons aller beaucoup plus loin avec les classes en créant des objets réagissant entre eux et ayant leur propres comportement.

Imaginons un sketch dans lequel se déplaceraient des atomes. Chaque atome est défini par une masse aléatoire qui influencera sa vitesse, plus sa masse sera grande plus il sera lent. Chacun d’entre eux possédera un nombre aléatoire d’électrons gravitant autour d’eux. Ces atomes se déplaceront sur la scène et rebondiront sur les « murs » de celle-ci. Leurs électrons tourneront autour en se rapprochant de l’atome puis en s’en éloignant jusqu’à une certaines limite définie par la masse de l’atome.

Lorsque deux atomes entrent en collision ceux-ci créaient alors un nouvel atome au design différent dont la masse sera l’addition de la masse des deux atomes d’origine. De même le nombre d’électrons gravitant autour de ce nouvel atome sera défini par l’addition du nombre d’électrons gravitant autour des deux atomes d’origine.

Enfin lorsque deux nouveaux atomes entrent en collision, ils se divisent pour recréer les deux atomes d’origines qui les composaient.

atoms

Un skecth comme celui ci est l’exemple parfait pour réaliser des classes. La première sera notre classe Atoms qui aura ses caractéristique propre :

• Position
• Masse
• Vitesse
• Nombre d’électrons

La seconde sera notre classe NewAtoms qui aura les caractéristiques suivante :

• Position (Position de la collision des deux atomes d’origine)
• Masse (Addition des deux masses)
• Vitesse
• Nombre d’électrons (Addition des électrons)

Nous obtenons donc les classe suivantes :

Il nous faut ensuite créer nos objets, les instancier et calculer leur collisions. Pour ce dernier point nous utiliserons la méthode dist() nous permettant de calculer la distance entre nos objets. Lorsque cette distance sera égale ou inférieure à 0 nous définirons une collision, créerons nos nouveaux atomes et supprimerons les atomes d’origine. Enfin nous calculerons les collisions entre les nouveaux atomes pour faire l’inverse en les supprimant et en recréant nos atomes d’origine

atoms_billboard