Intro:
My sister used to love butterflies, so I decided I would try to animate a Monarch butterfly migration flight in Processing.
Process:
I started by creating a class called Butterflies, and made a simple butterfly shape, with a body and wings. I then added some code that would make the Butterflies fly along the screen at varying speeds and at random points on the X axis to give a sense of magnitude to the migration.
Finally, in order to make the animation more dynamic, I added some code that told the Butterflies to move towards the X coordinate of the mouse, so that the user had some control over the animation.
Challenges:
I really wanted the butterflies to flap their wings as they flew, but I couldn’t figure out how to make that happen. I tried to add a variable butterflyWing with two possible states, butterflyExtend and butterflyContract. I wanted the butterflies to alternate between the two randomly on every frame count. I drew the two states, but no matter what I tried, I couldn’t get the result I wanted. I also wasn’t sure how to even search for what I wanted. I ended up watching a number of Coding Train videos in hopes of finding some help, but in the end I was unsuccessful.
Final:
Code:
The Butterfly Class code:
class Butterfly{
float posX, posY;
float butterflyWidth, butterflyHeight;
color butterflyColor;
float speed;
Butterfly(float _posX_, float _posY_, float _speed){
posX = _posX_;
posY = _posY_;
butterflyWidth = random(10, 20);
butterflyHeight = random(50, 100);
butterflyColor = color(252,127,3);
speed = _speed;
}
void migration(){
butterflyBody();
butterflyWing();
butterFly();
update();
}
void constructButterfly(float _posX_,float _posY_){
}
void butterFly(){
posY += speed;
if (posY > height+butterflyHeight/2) {
posY = +butterflyHeight/2;
}
}
void update(){
if (posX > mouseX){
posX --;
}
if (posX < mouseX){
posX ++;
}
}
void butterflyBody(){
fill(0);
stroke(0);
strokeWeight(1);
strokeJoin(ROUND);
ellipse(posX, posY, butterflyWidth, butterflyHeight);
}
void butterflyWing(){
fill(butterflyColor);
triangle(posX, posY, posX-butterflyHeight, posY+butterflyHeight/20, posX-butterflyHeight, posY+butterflyHeight);
triangle(posX, posY, posX+butterflyHeight, posY+butterflyHeight/20, posX+butterflyHeight, posY+butterflyHeight);
triangle(posX, posY, posX-butterflyHeight, posY-butterflyHeight/20, posX-butterflyHeight, posY-butterflyHeight);
triangle(posX, posY, posX+butterflyHeight, posY-butterflyHeight/20, posX+butterflyHeight, posY-butterflyHeight);
}
}
The operational code:
Butterfly[] myButterflies;
void setup(){
size(1280, 1280);
rectMode(CENTER);
myButterflies = new Butterfly[50];
for (int i=0; i<myButterflies.length; i++){
myButterflies[i] = new Butterfly(random(width), height + 100, random(5, 10));
}
}
void draw() {
background(255);
for (int i=0; i<myButterflies.length; i++){
myButterflies[i].migration();
}
}