Use GreenSock in P5.js editor
Posted on January 30, 2021 in
3 min read
P5.js is a great library to create dynamic and interactive sketches.
It's often used by creative people who knows how to code (creative coders) and by a lot of creatives in general that want to approach coding matter.
Indeed, P5.js (and Processing) has been always the perfect tool to start learning coding.
What is a little bit more challenging in p5.js is making animations, if compared with what some popular javascript libraries can do with very few lines of codes, such as GreenSock (also known as GSAP).
I wanted to investigate on possible outcomes by integrating P5.js with GSAP and keeping the barrier the lowest as possible for newbies and primers.
The setup
I'm using the P5.js online editor because it's the fastest setup we can imagine, just head to its URL, create and account, and you're ready to code.
The only extra step we need to do is to include the GSAP library within the scketch.
Add the following code within the head
in the index.html
file:
<script src="https://unpkg.com/gsap"></script>
P5 context
P5.js draws shapes and elements on a canvas
by means of sequential drawing calls. This means that all the shapes, elements and their properties, once drawn, are not available anymore and a new frame needs to be re-drawn from scratch.
GSAP (and other similar libraries), instead, animates existing properties over time, meaning that those properties need to be available across several frames.
Proxy variables
In order to make GSAP useful in P5.js context, we need some properties that act as proxy:
var x = 0
var y = 0
function draw(){
circle(x, y, 50)
}
function mouseClicked(){
gsap.to(this, {x:100, y:100})
}
In this case we pass this
to GSAP because x
and y
are public property of the P5 context.
Click to interact 👇 (source):
This works fine but for each element we want to animate, we need, at least, a pair of variables. This is not going to scale.Let's try to abstract the elements we want to animate with GSAP:
var elements = []
function setup() {
createCanvas(400, 400);
for(var i=0; i<50; i++){
elements.push({
x: width/2,
y: height/2,
r: 2
})
}
}
and in the draw function we can put simply this:
function draw(){
background(255)
elements.forEach(el => {
circle(el.x, el.y, el.r)
})
}
Now we need the trigger to start the GSAP animations:
function mouseClicked(){
gsap.to(elements, {
x:() => random(width),
y:() => random(height),
r:() => random(40),
stagger:0.1})
}
Click to interact 👇 (source):
Of course, everything that is a number can be animated with GSAP:Click to interact 👇 (source):
And by extension, here the same above example with the abstraction technique in order to draw many boxes, click to interact 👇, then press 1 (source)
So far, so good. Happy exploration!