int[] touchX=new int[256];
int[] touchY=new int[256];
int touchCount;
float x;
float y;
float forceX;
float forceY;
int[] coinTimer=new int[256];
float[] coinX=new float[256];
float[] coinY=new float[256];
float[] coinH=new float[256];
float[] coinG=new float[256];
int summonTimer;

void setup() {
  size(1024, 768);
    x=512;
    y=384;
    for(int i=0;i<coinTimer.length;i++){
    coinTimer[i]=-1;
  }
}

void draw() {
  background(255);
  if(summonTimer%2==0){
    int id=-1;
    for(int i=0;i<coinTimer.length;i++){
    if(coinTimer[i]==-1){
      id=i;
      break;
    }
  }
  if(id!=-1){
    coinX[id]=random(1024-32)+16;
    coinY[id]=random(768-32)+16;
    coinH[id]=-256;
    coinG[id]=4;
    coinTimer[id]=0;
  }
}
if(mousePressed){
  if(touchCount<64){
    touchX[touchCount]=mouseX;
    touchY[touchCount]=mouseY;
    if(touchCount>0){
      float power=len(touchX[touchCount-1],touchY[touchCount-1],touchX[touchCount],touchY[touchCount])/8;
      forceX+=sin(atan2(touchX[touchCount]-touchX[touchCount-1],touchY[touchCount]-touchY[touchCount-1]))*power;
      forceY+=cos(atan2(touchX[touchCount]-touchX[touchCount-1],touchY[touchCount]-touchY[touchCount-1]))*power;
    }
    touchCount++;
  }
  }else{
    touchCount=0;
  }
  //coinShaderDraw
  for(int i=0;i<coinTimer.length;i++){
    if(coinTimer[i]>=0){
      noStroke();
      fill(127);
      float shaderSize=map(coinH[i],0,-256,32,0);
      ellipse(coinX[i],coinY[i]+16,shaderSize,shaderSize/2);
    }
  }
  
  stroke(0);
  strokeWeight(8);
  fill(255);
  ellipse(x,y,64,64);
  
  //coinDraw
  for(int i=0;i<coinTimer.length;i++){
    if(coinTimer[i]>=0){
      noStroke();
      fill(0,map(coinH[i],0,-256,255,0));
      ellipse(coinX[i],coinY[i]+coinH[i],32,32);
      coinH[i]+=coinG[i];
      coinG[i]++;
      if(coinH[i]>0){
        coinH[i]=0;
        coinG[i]/=2;
        coinG[i]*=-1;
        if(coinG[i]>-2)coinG[i]=0;
      }
      coinTimer[i]++;
      for(int j=0;j<int(len(x,y,x+forceX,y+forceY));j++){
        if(len3d(x+sin(atan2(-forceX,-forceY))*j,y+cos(atan2(-forceX,-forceY))*j,0,coinX[i],coinY[i],coinH[i])<48){
          coinTimer[i]=-1;
        }
      }
    }
  }
  for(int i=0;i<touchCount;i++){
    stroke(127);
    strokeWeight(16);
    noFill();
    if(i>0){
      line(touchX[i-1],touchY[i-1],touchX[i],touchY[i]);
    }
  }
  for(int i=0;i<touchCount;i++){
    stroke(255);
    strokeWeight(8);
    noFill();
    if(i>0){
      line(touchX[i-1],touchY[i-1],touchX[i],touchY[i]);
    }
  }
  x+=forceX;
  y+=forceY;
  forceX=forceX/16*15;
  forceY=forceY/16*15;
  if(x<32){forceX*=-1;x=32;}
  if(y<32){forceY*=-1;y=32;}
  if(x>1024-32){forceX*=-1;x=1024-32;}
  if(y>768-32){forceY*=-1;y=768-32;}
  summonTimer++;
}
float len(float x0,float y0,float x1,float y1){
  return sqrt(pow(abs(x0-x1),2)+pow(abs(y0-y1),2));
}

float len3d(float x0,float y0,float z0,float x1,float y1,float z1){
  return sqrt(pow(abs(x0-x1),2)+pow(abs(y0-y1),2)+pow(abs(z0-z1),2));
}