Well, the whole thing should be like this :
Benda[] bola = new Benda[20];
color warna;
PVector gravitasi;
PVector angin;
PVector gesek;
float total_gravitasi = 10;
float total_angin = 0;
boolean firstMousePress = false;
void setup() {
size(600, 400, P3D);
for (int i=0; i < bola.length; i++) {
strokeWeight(2);
warna = color(random(255), random(255), random(255));
bola[i] = new Benda(mouseX, mouseY, random(30), warna);
}
}
void mousePressed() {
if ( mouseButton == LEFT ) {
for (int i=0; i < bola.length; i++) {
strokeWeight(2);
warna = color(random(255), random(255), random(255));
bola[i] = new Benda(mouseX, mouseY, random(30), warna);
}
firstMousePress = true;
}
}
void keyPressed() {
if (keyCode == UP) {
total_gravitasi+=0.5;
}
if (keyCode == DOWN) {
total_gravitasi-=0.5;
}
if (keyCode == LEFT) {
total_angin+=0.5;
}
if (keyCode == RIGHT) {
total_angin-=0.5;
}
}
void draw() {
background(#ffffff);
if (firstMousePress) {
gravitasi = new PVector(0, total_gravitasi);
angin = new PVector(total_angin, 0);
gesek = new PVector(0, 0);
for (int i=0; i < bola.length; i++) {
gesek = bola[i].kecepatan.copy();
gesek.normalize();
gesek.mult(-1);
gesek.mult(0.5);
bola[i].menabrak(bola, i);
bola[i].beriGaya(gesek);
bola[i].beriGaya(gravitasi);
bola[i].beriGaya(angin);
bola[i].perbarui();
bola[i].memantul();
bola[i].tampilkan();
}
String str1 = "Gravitasi";
String str2 = "Angin";
println(str1, total_gravitasi);
println(str2, total_angin);
fill(0);
textSize(20);
text("Gravitasi :", 10, 50, total_gravitasi);
text(total_gravitasi, 120, 50);
text("Angin :", 10, 70, total_angin);
text(total_angin, 120, 70);
}
}
class Benda {
float massa;
PVector lokasi;
PVector kecepatan;
PVector percepatan;
Benda[] bolaLain;
color warnaBola;
Benda(float x, float y, float size, color warna) {
lokasi = new PVector(x, y);
kecepatan = new PVector(random(-1, 1), random(-1, 1));
percepatan = new PVector(0, 0);
massa = size;
warnaBola = warna;
}
void tampilkan() {
fill(warnaBola);
ellipse(lokasi.x, lokasi.y, massa, massa);
}
void beriGaya(PVector gaya) {
PVector F = gaya.copy();
F.div(massa);
percepatan.add(F);
}
void perbarui() {
kecepatan = kecepatan.add(percepatan);
lokasi = lokasi.add(kecepatan);
percepatan.mult(0);
}
void menabrak(Benda[] bola, int index) {
bolaLain = bola;
float jarak, jarakMin, sudut;
float arahX, arahY;
for (int i=index+1; i< bola.length; i++) {
jarak = dist(bolaLain[i].lokasi.x, bolaLain[i].lokasi.y,
bola[index].lokasi.x, bola[index].lokasi.y );
jarakMin = bolaLain[i].massa/2 + bola[index].massa/2;
if ( jarak < jarakMin ) {
sudut = atan2(bolaLain[i].lokasi.y - bola[index].lokasi.y,
bolaLain[i].lokasi.x - bola[index].lokasi.x);
arahX = bola[index].lokasi.x + cos(sudut) * jarakMin;
arahY = bola[index].lokasi.y + sin(sudut) * jarakMin;
bola[index].percepatan.x = (arahX - bolaLain[i].lokasi.x) * 0.05;
bola[index].percepatan.y = (arahY - bolaLain[i].lokasi.y) * 0.05;
bola[index].kecepatan.x -= bola[index].percepatan.x;
bola[index].kecepatan.y -= bola[index].percepatan.y;
bolaLain[i].kecepatan.x += bola[index].percepatan.x;
bolaLain[i].kecepatan.y += bola[index].percepatan.y;
}
}
}
void memantul() {
if ( lokasi.x > width-massa/2 ) {
kecepatan.x = kecepatan.x * -1;
}
if ( lokasi.x < massa/2 ) {
kecepatan.x = kecepatan.x * -1;
}
if ( lokasi.y > height-massa/2 ) {
lokasi.y = height-massa/2;
kecepatan.y = kecepatan.y * -1;
}
if ( lokasi.y < massa/2 ) {
kecepatan.y = kecepatan.y * -1;
}
}
}
Although i left the background() outside, there shouldn’t be a difference…