class Vec{ float x,y; Vec(){ x=0; y=0; } Vec(float a,float b){ x=a; y=b; } Vec set(float a,float b){ x=a; y=b; return this; } float length(){ return sqrt(x*x+y*y); } float distance(Vec a){ float u=x-a.x; float v=y-a.y; return sqrt(u*u+v*v); } void normalize(){ float len=length(); x/=len; y/=len; } Vec add(Vec a,Vec b){ x=a.x+b.x; y=a.y+b.y; return this; } Vec add(Vec a){ x+=a.x; y+=a.y; return this; } Vec sub(Vec a,Vec b){ x=a.x-b.x; y=a.y-b.y; return this; } Vec sub(Vec a){ x-=a.x; y-=a.y; return this; } Vec mul(Vec a,float b){ x=a.x*b; y=a.y*b; return this; } Vec mul(float a){ x*=a; y*=a; return this; } Vec div(Vec a,float b){ x=a.x/b; y=a.y/b; return this; } Vec div(float a){ x/=a; y/=a; return this; } Vec dup(){ return new Vec(x,y); } Vec assign(Vec a){ x=a.x; y=a.y; return this; } void adjust(Vec a,float distance){ Vec unit=(new Vec()).sub(a,this); float dis=unit.length(); float d=distance-dis; if(dis==0) return; unit.div(dis); unit.mul(d*0.5); this.sub(unit); a.add(unit); } void adjust(Vec a,float distance,float alpha,float beta){ Vec unit=(new Vec()).sub(a,this); float dis=unit.length(); float d=distance-dis; if(dis==0) return; unit.div(dis); Vec unit2=unit.dup(); unit2.mul(d*beta); unit.mul(d*alpha); this.sub(unit); a.add(unit2); } void adjustMax(Vec a,float distance,float alpha,float beta){ Vec unit=(new Vec()).sub(a,this); float dis=unit.length(); float d=distance-dis; if(dis10 ? 1 : u.life*0.1; ellipse(u.pos.x,u.pos.y,sz,sz); if(u.life--<0){ erase(i); --i; } for(int y=0; y<32; ++y){ for(int x=0; x<32; ++x){ float dx=curtain.pos[y*32+x].pos.x-u.pos.x; float dy=curtain.pos[y*32+x].pos.y-u.pos.y; float len=dx*dx+dy*dy; if(len<4){ float ddx=(curtain.pos[y*32+x].vel.x-u.vel.x); float ddy=(curtain.pos[y*32+x].vel.y-u.vel.y); curtain.pos[y*32+x].pos.x-=ddx*0.02; curtain.pos[y*32+x].pos.y-=ddy*0.02; u.vel.x+=ddx*0.05; u.vel.y+=ddy*0.05; } } } } } } BImage back; int count=0; void setup(){ size(256,350); back=loadImage("back.jpg"); curtain=new Curtain(); bullets=new Bullets(); textFont(loadFont("Futura-ExBlack.vlw.gz"),20); framerate(50); } void gene(float x,float y){ for(int i=0; i<10; i++){ bullets.put(new Vec(x,y),new Vec(random(-0.5,0.5),random(-3.0,-2))); } } float ssc=256.0/32.0; void mousePressed(){ if(count<255) return; gene(mouseX/ssc,mouseY/ssc); } void loop(){ count+=2; if(count<255) background(count); else background(back); push(); scale(ssc); curtain.update(); curtain.draw(); stroke(0,0,0); fill(255,255,255); beginShape(TRIANGLE_STRIP); vertex(mouseX/ssc,mouseY/ssc-1); vertex(mouseX/ssc-1,mouseY/ssc+1); vertex(mouseX/ssc+1,mouseY/ssc+1); endShape(); bullets.draw(); pop(); }