/*
CINDY CHI
NOV. 19, 2008
DMA 28: INTERACTIVITY
EXCERCISE M
For processing monsters. http://rmx.cz/monsters/
Click somewhere to produce a piece of food and the monsters will come
and eat it! The monsters take turns to eat startig from the top left
corner.
*/
int numMonsters = 9;
Monster[] monsters = new Monster[numMonsters];
float[] monsterX = {64, 190, 320, 66.5, 185, 320, 70, 220, 335};
float[] monsterY = {66.5, 70, 80, 175, 185, 210, 330, 325, 330};
int[] monsterSize = {3, 5, 7, 4, 3, 6, 5, 6, 3};
float[] monsterEyes = {10, 13, 20, 12, 10, 15, 12, 14, 10};
float[] monsterMouthW = {8, 12, 15, 10, 8, 13, 12, 13, 8};
float[] monsterMouthH = {7, 10, 13, 8, 7, 12, 10, 11, 7};
boolean drawn = false;
float circleX = 0.0;
float circleY = 0.0;
int counter = 0; //counts which monster gets to eat
float easing = 0.07;
float startMillis;
boolean smile = false;
void setup()
{
size(400, 400);
smooth();
for(int i = 0; i < monsters.length; i++)
{
monsters[i] = new Monster();
}
}
void draw()
{
background(0);
//Assign and display monsters
for(int i = 0; i < monsterX.length; i++)
{
monsters[i].assign(monsterX[i], monsterY[i], monsterSize[i], monsterEyes[i], monsterMouthW[i], monsterMouthH[i]);
monsters[i].display();
}
//Feeding monsters
if(drawn == true)
{
stroke(255);
strokeWeight(2);
monsters[counter - 1].eat(counter - 1);
ellipse(circleX, circleY, 20, 20);
}
}
class Monster
{
float inc = 0.0; //for tal
float currentTime = millis();
float x;
float y;
int tents;
float eyes;
float mouthW;
float mouthH;
void assign(float xpos, float ypos, int tentacles, float eyeSpace, float mouthWidth, float mouthHeight)
{
x = xpos;
y = ypos;
tents = tentacles;
eyes = eyeSpace;
mouthW = mouthWidth;
mouthH = mouthHeight;
}
void display()
{
currentTime = millis();
stroke(255);
inc += 0.02; //increases speed of tail bending
float angle = sin(inc) / 10.0 + sin(inc * 1.2) / 20.0;
pushMatrix();
translate(x, y);
tail(0, 0, tents, angle * 1.01);
rotate(radians(5));
tail(0, 0, tents + 5, angle * .5);
rotate(radians(5));
tail(0, 0, tents + 3, angle * 1.01);
rotate(radians(5));
tail(0, 0, tents - 2, angle * 1.04);
rotate(radians(5));
tail(0, 0, tents, angle * .3);
rotate(radians(5));
tail(0, 0, tents, angle * 1.05);
rotate(radians(5));
tail(0, 0, tents + 2, angle * .5);
rotate(radians(5));
tail(0, 0, tents - 3, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 1, angle * .7);
rotate(radians(5));
tail(0, 0, tents + 4, angle * .3);
rotate(radians(5));
tail(0, 0, tents, angle * .3);
rotate(radians(5));
tail(0, 0, tents + 2, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents - 3, angle * .5);
rotate(radians(5));
tail(0, 0, tents + 3, angle * 1.02);
rotate(radians(5));
tail(0, 0, tents - 1, angle * 1.01);
rotate(radians(5));
tail(0, 0, tents, angle * .4);
rotate(radians(5));
tail(0, 0, tents + 5, angle * 1.05);
rotate(radians(5));
tail(0, 0, tents + 3, angle * .6);
rotate(radians(5));
tail(0, 0, tents - 2, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents, angle * .9);
rotate(radians(5));
tail(0, 0, tents + 2, angle * .3);
rotate(radians(5));
tail(0, 0, tents + 1, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents - 2, angle * 1.05);
rotate(radians(5));
tail(0, 0, tents + 4, angle * .5);
rotate(radians(5));
tail(0, 0, tents - 3, angle * 1.04);
rotate(radians(5));
tail(0, 0, tents + 5, angle * .9);
rotate(radians(5));
tail(0, 0, tents + 2, angle * .6);
rotate(radians(5));
tail(0, 0, tents - 2, angle * 1.02);
rotate(radians(5));
tail(0, 0, tents, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 4, angle * .3);
rotate(radians(5));
tail(0, 0, tents, angle * .3);
rotate(radians(5));
tail(0, 0, tents + 2, angle * .5);
rotate(radians(5));
tail(0, 0, tents - 1, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 3, angle * 1.02);
rotate(radians(5));
tail(0, 0, tents - 1, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 1, angle * .5);
rotate(radians(5));
tail(0, 0, tents, angle * .9);
rotate(radians(5));
tail(0, 0, tents - 3, angle * .2);
rotate(radians(5));
tail(0, 0, tents + 2, angle * 1.02);
rotate(radians(5));
tail(0, 0, tents + 3, angle * .4);
rotate(radians(5));
tail(0, 0, tents + 5, angle * .3);
rotate(radians(5));
tail(0, 0, tents, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 2, angle * 1.01);
rotate(radians(5));
tail(0, 0, tents - 2, angle * 1.04);
rotate(radians(5));
tail(0, 0, tents - 3, angle * .4);
rotate(radians(5));
tail(0, 0, tents - 2, angle * .2);
rotate(radians(5));
tail(0, 0, tents, angle * .6);
rotate(radians(5));
tail(0, 0, tents + 5, angle * 1.02);
rotate(radians(5));
tail(0, 0, tents - 1, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 2, angle * .9);
rotate(radians(5));
tail(0, 0, tents, angle * .7);
rotate(radians(5));
tail(0, 0, tents + 2, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 5, angle * 1.01);
rotate(radians(5));
tail(0, 0, tents - 1, angle * 1.04);
rotate(radians(5));
tail(0, 0, tents -3, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents, angle * .2);
rotate(radians(5));
tail(0, 0, tents - 2, angle * .3);
rotate(radians(5));
tail(0, 0, tents + 4, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 1, angle * 1.05);
rotate(radians(5));
tail(0, 0, tents, angle * .3);
rotate(radians(5));
tail(0, 0, tents + 2, angle * .4);
rotate(radians(5));
tail(0, 0, tents + 4, angle * .7);
rotate(radians(5));
tail(0, 0, tents - 2, angle * 1.02);
rotate(radians(5));
tail(0, 0, tents, angle * .9);
rotate(radians(5));
tail(0, 0, tents - 3, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 5, angle * 1.05);
rotate(radians(5));
tail(0, 0, tents + 2, angle * .7);
rotate(radians(5));
tail(0, 0, tents + 1, angle * .4);
rotate(radians(5));
tail(0, 0, tents, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents - 1, angle * 1.02);
rotate(radians(5));
tail(0, 0, tents + 1, angle * 1.03);
rotate(radians(5));
tail(0, 0, tents + 4, angle * .8);
rotate(radians(5));
tail(0, 0, tents - 3, angle * .3);
popMatrix();
//blinking eyes
fill(0);
if(smile == true) //when eats food
{
monsters[counter-1].smile();
}
else
{
if(currentTime%50 == 0) //blink
{
stroke(0);
strokeWeight(2);
line(x - eyes, y, x - (eyes - 3), y);
line(x + eyes, y, x + (eyes - 3), y);
}
else //regular eyes
{
ellipse(x - (eyes - 5), y, 5, 15);
ellipse(x + (eyes - 5), y, 5, 15);
}
}
}
//EATING
void eat(int whichMonster)
{
int i = whichMonster;
//mouth for eating
strokeWeight(2);
rect(monsterX[i] - (mouthW/2), monsterY[i] + 5, mouthW, mouthH);
monsterX[i] += (circleX - monsterX[i]) * easing;
monsterY[i] += ((circleY - 15) - monsterY[i]) * easing;
if(circleX >= monsterX[i] - 10 && circleX <= monsterX[i] + 10
&& circleY >= monsterY[i] + 5 && circleY <= monsterY[i] + 35)
{
drawn = false;
startMillis = millis();
smile = true;
}
}
//HAPPY EYES WHEN EATS
void smile()
{
if(currentTime - startMillis <= 1000)
{
stroke(0);
strokeWeight(2);
//left eye
line(x - eyes, y, x - (eyes - 5), y - 5);
line(x - (eyes - 5), y - 5, x - (eyes - 10), y);
//right eye
line(x + eyes, y, x + (eyes - 5), y - 5);
line(x + (eyes - 5), y - 5, x + (eyes - 10), y);
inc += 0.4; //increases speed of tentacles
}
else
{
smile = false;
inc += 0.02;
}
}
}
void tail(int x, int y, int units, float angle) //x, y, length, angle of bend
{
pushMatrix();
translate(x, y);
for (int i = units; i > 0; i--)
{
strokeWeight(i); //changes thickness
line(0, 0, 0, .5);
translate(0, -8); //controls closeness of lines
rotate(angle);
}
popMatrix();
}
void mousePressed()
{
drawn = true;
circleX = mouseX;
circleY = mouseY;
if(counter < 9)
{
counter++;
}
else
{
counter = 1;
}
}
Cindy - M
on Monday, Nov 24, 2008 – 2:35 am
One Comment
Cindy, this is programmed in a strange way. Let’s talk about it to clarify some things.