You are on page 1of 4

MRect r1, r2, r3, r4; void setup() { size(640, 360); fill(255, 204); noStroke(); r1 = new MRect(1, r2 = new

MRect(2, r3 = new MRect(2, r4 = new MRect(1, } void draw() { background(0); r1.display(); r2.display(); r3.display(); r4.display(); r1.move(mouseX-(width/2), mouseY+(height*0.1), 30); r2.move((mouseX+(width*0.05))%width, mouseY+(height*0.025), 20); r3.move(mouseX/4, mouseY-(height*0.025), 40); r4.move(mouseX-(width/2), (height-mouseY), 50); } class MRect { int w; // single bar width float xpos; // rect xposition float h; // rect height float ypos ; // rect yposition float d; // single bar distance float t; // number of bars MRect(int iw, float ixp, float ih, float iyp, float id, float it) { w = iw; xpos = ixp; h = ih; ypos = iyp; d = id; t = it; } void move (float posX, float posY, float damping) { float dif = ypos - posY; if (abs(dif) > 1) { ypos -= dif/damping; } dif = xpos - posX; if (abs(dif) > 1) { xpos -= dif/damping; } } void display() { for (int i=0; i<t; i++) { rect(xpos+(i*(d+w)), ypos, w, height*h); } } }

134.0, 0.532, 0.1*height, 10.0, 60.0); 44.0, 0.166, 0.3*height, 5.0, 50.0); 58.0, 0.332, 0.4*height, 10.0, 35.0); 120.0, 0.0498, 0.9*height, 15.0, 60.0);

float gravidade=0.05; // acelerao em y apenas (positiva dado que a origem est em cima float perda=1; // colocar um valor um pouco mais baixo que 1 para perdas com toques CBola bolas[]; int nbolas; class CBola { PVector posicao, velocidade; color cor; // cor da bola float raio; // raio da bola int colisoes[], ncolisoes; CBola() { raio=random(8,16); posicao=new PVector(random(raio,width-raio), random(raio,height-raio)); velocidade=new PVector(random(-2,2), random(-2,2)); cor=color(random(32,255),random(32,255),random(32,255)); colisoes=new int[nbolas]; ncolisoes=0; for(int i=0;i<nbolas;i++) colisoes[i]=0; } void AtualizarColisoes(int ibola) { int i; for(i=ibola+1;i<nbolas;i++) if(Colisao(bolas[i])) { if(colisoes[i]==0) { PVector eixoColisao=new PVector(bolas[i].posicao.xposicao.x,bolas[i].posicao.y-posicao.y); float impulso1=velocidade.mag()*cos(PVector.angleBetween(eixoColisao,velocida de)); float impulso2=bolas[i].velocidade.mag()*cos(PVector.angleBetween(eixoColisao ,bolas[i].velocidade)); eixoColisao.normalize(); eixoColisao.mult(impulso1-impulso2); bolas[i].velocidade.add(eixoColisao); eixoColisao.normalize(); eixoColisao.mult(impulso2-impulso1); velocidade.add(eixoColisao); velocidade.mult(perda); bolas[i].velocidade.mult(perda); // registar estado de coliso colisoes[i]=1; bolas[i].colisoes[ibola]=1; ncolisoes++; bolas[i].ncolisoes++;

} } else if(colisoes[i]==1) // j no se encontra em coliso, desligar { colisoes[i]=0; bolas[i].colisoes[ibola]=0; ncolisoes--; bolas[i].ncolisoes--; } } void Actualizar() { int i; velocidade.y+=gravidade; // colises com outras bolas // mover posicao.add(velocidade); // colises com as paredes (atualiza logo posio para garantir que respeita as paredes) if(posicao.x<=raio) { velocidade.x=-velocidade.x; // inverte posicao.x+=velocidade.x; if(posicao.x<=raio) posicao.x=raio; velocidade.x*=perda; } else if(posicao.x>=width-raio) { velocidade.x=-velocidade.x; // inverte posicao.x+=velocidade.x; if(posicao.x>=width-raio) posicao.x=width-raio; velocidade.x*=perda; } // y aberto em cima, pelo que no h reflexo em cima if(posicao.y>=height-raio) { velocidade.y=-velocidade.y; // inverte posicao.y+=velocidade.y; if(posicao.y>=height-raio) posicao.y=height-raio; velocidade.y*=perda; } // println("Velocidade "+sqrt(velocidade.x*velocidade.x+velocidade.y*velocidade.y)); // desenhar noStroke(); fill(cor); ellipse(posicao.x,posicao.y,raio,raio); // caso esteja em estado de coliso, realar if(ncolisoes>0) { fill(255,63);

ellipse(posicao.x,posicao.y,raio+3,raio+3); } } // colises entre bolas, determinao boolean Colisao(CBola bola) { // mesma bola, mas mesmo que no fosse no seria possvel obter uma direo, // as bolas esto exatamente no mesmo ponto if(posicao.x==bola.posicao.x && posicao.y==bola.posicao.y) return false; // eliminao da chamada raiz quadrada return ((raio+bola.raio)*(raio+bola.raio) > (posicao.x-bola.posicao.x)*(posicao.x-bola.posicao.x)+(posicao.ybola.posicao.y)*(posicao.y-bola.posicao.y)); } } void setup() { size(200, 300); background(0); smooth(); nbolas=hour()+1; // nbolas=2; println("Bolas: " + nbolas); bolas=new CBola[nbolas]; for(int i=0;i<nbolas;i++) bolas[i]=new CBola(); frameRate(100); } void draw() { background(0); ellipseMode(RADIUS); for(int i=0;i<nbolas;i++) bolas[i].AtualizarColisoes(i); for(int i=0;i<nbolas;i++) bolas[i].Actualizar(); }

You might also like