-
Notifications
You must be signed in to change notification settings - Fork 0
/
particle.pde
109 lines (92 loc) · 2.2 KB
/
particle.pde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
class Particle {
ArrayList<FloatList> traj;
private boolean left, fall, isInit;
private float sway = 0.0;
private float xPos, yPos, diameter, xVel, yVel, gravity;
private float maxSpeed = 1.0;
private int swayCount, swayInterval, resetInc;
private int state;
private final int SLOW = 0;
private final int FALL = 1;
private final int STOP = 2;
Particle(float xp, float yp, float dia, float xv, float yv) {
xPos = xp;
yPos = yp;
diameter = dia;
xVel = xv;
yVel = yv;
swayInterval = round(random(10, 80));
gravity = random(0.1f, 0.6f);
isInit = false;
state = 0;
traj = new ArrayList<FloatList>();
}
void display() {
fill(255);
ellipse(xPos, yPos, diameter, diameter);
}
void move() {
switch (state) {
case SLOW:
if (abs(xVel) > 0 || abs(yVel) > 0) {
yVel *= 0.98f;
xVel *= 0.98f;
if (abs(xVel) <= 0.05 && abs(yVel) <= 0.05) {
state = 1;
}
}
yPos += gravity;
xPos += xVel;
yPos += yVel;
break;
case FALL:
swayCount++;
gravity += 0.002f * speedChange;
if (swayCount > swayInterval) {
left =! left;
swayInterval = round(random(10, 80)); //reset it
swayCount = 0;
}
if (left && xVel > -maxSpeed) {
xVel-= sway;
} else if (!left && xVel < maxSpeed) {
xVel+= sway;
}
sway += 0.0001f;
if (yPos >= bottomRow) {
state = STOP;
} else {
xPos += xVel;
yPos += (yVel + gravity);
}
break;
case STOP:
yVel = 0;
xVel = 0;
break;
}
FloatList point = new FloatList();
point.append(xPos);
point.append(yPos);
traj.add(point);
resetInc = traj.size()-1;
}
boolean init(boolean attract) {
theta = atan2((mouseY-yPos), (mouseX-xPos));
if (attract) {
yVel = 1.0 * sin(theta)*2.5f;
xVel = 1.0 * cos(theta)*2.5f;
} else {
yVel = -1.0 * sin(theta)*2.5f;
xVel = -1.0 * cos(theta)*2.5f;
}
return true;
}
void reset() {
if (resetInc >= 0) {
xPos = traj.get(resetInc).get(0);
yPos = traj.get(resetInc).get(1);
}
resetInc--;
}
}