--- title: Creative Coding with P5.js tags: frontend, javascript, typescrypt robots: noindex, nofollow author: Julien Noyer --- # P5.js Getting Started *Using the metaphor of a sketch, p5.js has a full set of drawing functionality* ![](https://i.imgur.com/YpCHSs8.png) > &copy; [Julien Noyer](https://www.linkedin.com/in/julien-n-21219b28/) - All rights reserved for educational purposes only --- ## Présentation de la librairie P5.js [P5.js](https://p5js.org) est une librairie qui à pour ambition de rendre accessible et plus lisible la génération de visuels sur une canvas HTML. Nullement réservée à des profils expert, l'objectif de P5.js est de permettre à des designers de débuter dans la création graphique assitée par ordinateur. Très inspirée par le [langage Processing](https://fr.wikipedia.org/wiki/Processing), P5.js est un outil idéal car il permet en plus de la création graphique, d'apprendre des principes qui sont ensuite transposables dans d'autres pratiques. > En savoir plus https://hackmd.io/@teach-supports/HJO_FabhF <br> ## Présentation du répertoire Le projet développé dans ce répertoire à pour but d'explorer les possibilités offertes par P5.js pour la création d'élements graphique. Il aborde certaines notion spécifiques à la librairie, tout en préférent utiliser au maxium les éléments natifs en Javascript pour que l'apprentissage de P5.js puisse être avoir avant tout pour objectif de consolider et renforcer des connaissance en programmation Javascript. <br> ## Explication du code ### Function `setup()` L'objectif de cette fonction est de pouvoir définir des valeurs/variables à utiliser dans le `sketch`. Il s'agit ici d'un principe de base en informatique, tous les programmes ont besoin pour fonctionner d'espace mémoire pour stocker des informations, P5.js intègre avec cette fonction la même structure qu'en Processing. ```js // Declare all the variables at the top document let canvasWidth = null; let canvasHeigth = null; let canvasColor = null; let svgImage = null; // P5.js setup() function setup(){ // Set canvas size canvasWidth = window.innerWidth; canvasHeigth = window.innerHeigth; // Set canvas background color canvasColor = `rgba(100, 100, 100, 1)`; } ``` **Ressources** - [P5.js finction setup()](https://p5js.org/reference/#/p5/setup) - [MDN objet window](https://developer.mozilla.org/fr/docs/Web/API/Window) - [MDN référence couleur RGBA](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgba()) ### Function `preload()` Avec P5.js il est possible d'utiliser des `assets` - images, fonts, vidéos, ... - dans les sketchs, mais il faut pour les rendre disponibles les importer dans la fonction `preload()` dont le but est de rendre accessible les assets dans les différentes fonctions de P5.js. La fonction `preload()` est à définir **avant la fonction `setup()`**. ```js // P5.js preload() function preload(){ // Load file svgImage = loadImage('assets/svg/smile.svg'); } ``` **Ressources** - [P5.js fonction preload()](https://p5js.org/reference/#/p5/preload) - [P5.js fonction loadImage](https://p5js.org/reference/#/p5/loadImage) <br> <br> ### Function `draw()` Cette fonction permet de dessiner sur le canvas, et il est très important de comprendre la logique mise en place par P5.js et la plupart des principes d'animations. Pour comprendre cette logique, il faut faire un bon dans le passé, et apprendre comment les premiers dessins animés ont été réalisés. De Disney à Myasaki la technique est la même, plusieurs images s'enchane les une à la suite des autres, créant ainsi une impression de mouvement. La fonction `draw()` de P5.js agit de la m-eme manière, en créant 60 images par seconde. ```js // P5.js draw() function draw(){ // Add background color: color value background(canvasColor); // Add image: image, x, y image(svgImage, 10, 10; } ``` **Ressources** - [P5.js fonction draw()](https://p5js.org/reference/#/p5/draw) - [P5.js fonction background](https://p5js.org/reference/#/p5/background) - [P5.js fonction image](https://p5js.org/reference/#/p5/image) <br> ## Les formes graphiques (shape) Le code précédent permet d'afficher une image de 50x50 pixels à 10 pixel du coin supérieur gauche du canvas. Les `shapes` en P5.js ont tous des propriétés communes, pour les positionner par exemple, c'est pourquoi il est préférable de travailler sur le principe de `class` pour les créer afin de simplifier leur manipulation. ### Classe `Shape` Cette classe permet de définir les valeurs communes à toutes les formes, elle est ensuite étendue aux autres classes qui permettent de générer une forme spécfique. ```js class Shape{ constructor(x, y, width, heigth){ // Use `Vector` to set position this.position = new p5.Vector(x, y); // Set shape width and height this.width = width; this.heigth = heigth; }; } ``` **Ressources** - [P5.js classe Vector](https://p5js.org/reference/#/p5.Vector) - [MDN classe Javascript](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Classes) ### Classe `Ellipse` Cette classe permet de créer une nouvelle forme de type `Ellipse`, elle sert de base pour créer toutes les autres classes pour les différentes formes souhaitées. ```js class Ellipse{ constructor(x, y, width, heigth){ // Use super function to inject Shape constructor values super(x, y, width, heigth); // Set Ellipse colors this.strokeWeight = 5; this.strokeColor = `rgba(255, 255, 255, 1)`; this.fillColor = `rgba(0, 0, 0, 1)`; }; // Method to initiate shape init(){ // Set colors stroke(this.strokeColor) strokeWeight(this.strokeWeight); fill(this.fillColor); // Display shape this.display(); } // Method to display ellipse display() { // Define position mode ellipseMode(CENTER); // Add ellispe in canves ellipse(this.position.x, this.position.y, this.width, this.heigth); }; } ``` **Ressources** - [P5.js fonction stroke](https://p5js.org/reference/#/p5/stroke) - [P5.js fonction strokeWeight](https://p5js.org/reference/#/p5/strokeWeight) - [P5.js fonction ellipse](https://p5js.org/reference/#/p5/ellipse) - [P5.js fonction ellipseMode](https://p5js.org/reference/#/p5/ellipseMode) - [MDN fonction super()](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Operators/super) ### Création d'une forme de type `Ellipse` Les deux classes précédemments créées permettent de créer une ellipse, pour les utiliser, il faut dans un permier temps déclarer une variable `mainShape` pour ensuite instancier un nouvel objet depuis la classe `Ellipse` dans la foncion `setup()` de la manière suivante : ```js // P5.js setup() function setup(){ // Set canvas size canvasWidth = window.innerWidth; canvasHeigth = window.innerHeigth; // Set canvas background color canvasColor = `rgba(100, 100, 100, 1)`; // Set mainShape position, width and heigth mainShape = new Ellipse(canvasWidth / 2, canvasHeigth / 2, 30, 30) } ``` **Ressources** - [MDN opérateur new](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Operators/new) <br> La classe `Ellipse` dispose d'une méthode `init()` qui permet de définir les valuers et qui appel une méthode `display()` qui permet quant à elle d'afficher l'ellipse dans le canvas. Nous allons donc utiliser la méthode `init()` dans la fonction `draw()` de la manière suivante : ```js // P5.js draw() function draw(){ // Add background color: color value background(canvasColor); // Add image: image, x, y image(svgImage, 10, 10; // Add mainShape mainShape.init(); } ``` <br> ## Ajouter des fonctionnalités à des formes L'ajout d'une fonctionnalité spécifiques, comme par exemple permettre le déplacement d'une forme, ne peut se faire qu'en intégrant la notion de classe dans les sketchs P5.js. Si cette dernière phrase n'est qu'a moitier vraie, il n'y à en revanche aucun doute sur le fait que les classe sont faites pour générer des objets qui ont des fonctionnalités spécifiques. L'avantage d'avoir travailler avec une classe `Shape` et une classe `Ellipse` - et de décliner autant de classe que de forme voulue - est qu'il est possible de créer des fonctionnalités globales pour toutes les formes, et de fonctionnalité spécifique par forme. Il s'agit ici de structuration de code en Javascript, P5.js peut éventuellement vous proposer une méthodologie différentes. Pour ajouter une fonctionnalité à un objet instancier depuis une classe, il faut ajouter une ùéthode dans la classe et y intégrer le code voulu. Dans notre exemple, nous allons faire en sorte de déplacer `mainShape` vers la droite à chque fois qu'une touche du clavier et pressée. Nous allons ajouter cette fonctionnalité sur la classe `Shape` pour plus de lisibilité mais vous pouvez decider de l'ajouter uniquement sur `Ellipse` ou sur une autre forme que vous aurez créé. ```js class Shape{ constructor(x, y, width, heigth){ // Use `Vector` to set position this.position = new p5.Vector(x, y); // Set shape width and height this.width = width; this.heigth = heigth; }; // Method to move shape move(){ // Add 5 pixel to X position value this.position.x += 5; } } ``` <br> Une fois cette méthode ajoutée sur la classe `Shape`, il est possible de l'appeler dans la fonction `draw()` de la manière suivante : ```js // P5.js draw() function draw(){ // Add background color: color value background(canvasColor); // Add image: image, x, y image(svgImage, 10, 10; // Add mainShape mainShape.init(); // Bind keypress event if(keyIsPressed){ // Move shape by calling move() shape method mainShape.move(); }; } ``` <br> **Ressources** - [P5.js varaibles keyIsPressed](https://p5js.org/reference/#/p5/keyIsPressed) - [MDN événement keypress](https://developer.mozilla.org/fr/docs/Web/API/Document/keypress_event)