yoyo y;
HashSet frogs = new HashSet();
HashSet deadfrogs = new HashSet();

HashSet flies = new HashSet();

int frogcount = 3;


void setup(){
  size(400,400);

  y = new yoyo(229,200,"yoyo.gif");

 frogs= new HashSet();
 deadfrogs= new HashSet();
 flies = new HashSet();


  for(int i = 0; i < frogcount;i++){
    //frog f = new frog(round(random(400)),round(random(400)),"froglive.gif");
    
    //frogs.add(f);
    addFrog();
  }
String[] a = {"fly1.gif","fly2.gif"};
  for (int i =0; i < 3;i++){
     flies.add(new fly(round(random(100)+100 ),round(random(100)+100),a ));
  }

}

int c;




void draw(){
  background(128);
  //m.x = mouseX;
  // m.y = mouseY;

  c++;
  if(c % 50 == 0){
    //m.changeframe(m.currentframe==0?1:0); 
  }


  y.move();

  y.draw();

  int howmanyToAdd = 0;

  Iterator it = frogs.iterator();
  while(it.hasNext()){
    frog f = (frog)it.next();
    f.bounds();
    f.move();
    

    f.draw();
    if(y.overlap(f)){
    //frog df = new frog(f.x,f.y,"deadfrog.gif");
    //deadfrogs.add(df);
    f.xs = y.xs;
    f.ys = y.ys;
   // it.remove();
     howmanyToAdd ++;
    
    }
  }

for (int i = 0; i <  howmanyToAdd ;i++){
 //  addFrog(); 
}


  it = flies.iterator();
    while(it.hasNext()){
    fly f = (fly)it.next();
    f.move();

    f.draw();
    
    }

}

class fly extends sprat{
    float xs,ys, fy,fx;
  float sz = 20;
   fly(int x, int y, String s[]){
    super(x,y,s);
    fy = y; 
    fx = x;

  }
  
  void move(){
     if(fx < 200){xs += .3;} 
          if(fy < 200){ys += .3;}
     if(fx> 200){xs -= .3;} 
          if(fy > 200){ys -= .3;}
  
    fx += xs;
    fy += ys;
    x = round(fx);
    y = round(fy);
  }
}

class frog extends sprat{
  frog(int x, int y, String s){
    super(x,y,s);
    fy = y; 
    fx = x;

  }
  float xs,ys, fy,fx;
  float sz = 20;
  void move(){
    ys += .1;
    fy+=ys;
    fx+=xs;
    x = round(fx);
    y = round(fy);
  }

  void bounds(){
     if(fx < 0){
        xs = abs(xs);
        fx = 0 ;
     } 
     if(x+sz+sz >= 400){
        xs = -abs(xs);
        fx = 400 - sz - sz;
     } 
     if(y < 0){
        ys = abs(ys);
        
        fy = 0;
     } 
     if(y+sz >= 400){
        ys = -abs(ys);
        fy = fy - sz - sz;
     } 
  }
}

class yoyo extends sprat{
  float fx,fy,xs,ys;
  boolean mOn = true;
  yoyo(int x, int y, String s){
    super(x,y,s);
  }
  void move(){
    ys += .8; //gravity
    if(mOn) {
      xs += ( mouseX - (fx+20)) / 10.0; 
      ys += ( mouseY - (fy+20)) / 10.0;
    }
    // if(mOn){
    xs *= .8;
    ys *= .8;
    // }
    fx += xs;
    fy += ys;
    y = round(fy);
    x = round(fx);
  }
  void draw(){
    stroke(0);
    strokeWeight(2);
    line(mouseX,mouseY,fx+20,fy+20);
    super.draw();
  }


}



class sprat{
  int x,y,w,h;
  int framecount;
  int currentframe;
  PImage img[];
  sprat(int px,int py, String imgname){
    String s[] = new String[1];
    s[0] = imgname;
    init(px,py,s);
  } 
  sprat(int px,int py, String[] imgname){
    init(px,py,imgname);
  } 

  void init (int px,int py, String[] imgname){
    x = px; 
    y = py; 
    img = new PImage[imgname.length];
    for(int i = 0; i < imgname.length; i++){
      img[i] = loadImage(imgname[i]);      
    }
    changeframe(0);
  } 
  void changeframe(int whatframe){
    currentframe = whatframe;
    w = img[currentframe].width;
    h = img[currentframe].height;
  }

  void draw(){
    image(img[currentframe],x,y);
  }

  //so we have a physical x and y on screen
  //find the pixel for this thing
  //WARNING no bounds checking
  color pixelAtPhysicalLocation(int px, int py){
    int rx = px - x;
    int ry = py - y;
    return img[currentframe].pixels[rx + (ry * w)];
  }

  boolean overlap(sprat other){
    intRange vOverlap = spratOverlapVert(other);
    intRange hOverlap = spratOverlapHoriz(other);
    if(vOverlap == null || hOverlap == null){
      return false;
    }
    //hrrm, why couldn't this be <= ????
    for(int a = hOverlap.min; a < hOverlap.max; a++){
      for(int b = vOverlap.min; b < vOverlap.max; b++){
        if(alpha(this.pixelAtPhysicalLocation(a,b)) > 128 && alpha(other.pixelAtPhysicalLocation(a,b)) > 128    ){
          return true; 
        }
      }
    }

    return false;
  }

  // to see if things overlap on one dimension
  // we sort the 4 points. if both points of 
  // one thing are lesser than both points of the other,
  // they can't be overlapping...
  intRange spratOverlapHoriz(sprat b){
    sprat a = this;
    intWithRef vals[] = new intWithRef[4];
    vals[0] = new intWithRef((int)a.x,a);
    vals[1] = new intWithRef((int)(a.x+a.w),a);
    vals[2] = new intWithRef((int)b.x,b);
    vals[3] = new intWithRef((int)(b.x+b.w),b);
    Arrays.sort(vals);
    if (vals[0].src == vals[1].src){
      return null; 
    }
    return new intRange(vals[1].val,vals[2].val);
  }

  intRange spratOverlapVert(sprat b){
    sprat a = this;
    intWithRef vals[] = new intWithRef[4];
    vals[0] = new intWithRef((int)a.y,a);
    vals[1] = new intWithRef((int)(a.y+a.h),a);
    vals[2] = new intWithRef((int)b.y,b);
    vals[3] = new intWithRef((int)(b.y+b.h),b);
    Arrays.sort(vals);
    if (vals[0].src == vals[1].src){
      return null; 
    }
    return new intRange(vals[1].val,vals[2].val);

  }

}

class intRange{
  int min, max;
  intRange(int p1, int p2){
    min = p1<p2?p1:p2; 
    max = p1>p2?p1:p2; 
  }
}

class intWithRef implements Comparable{
  int val; 
  Object src;
  intWithRef(int pval,Object psrc){
    val = pval; 
    src = psrc;
  } 
  public int compareTo(Object o){
    return val - ((intWithRef)o).val;
  }

}





void addFrog(){
  //every dude is launched  from one of the 4 walls
  float posOnWall = random(400);
  float mainSpeed = random(10);
  //speed parallel to wall
  float lateralSpeed = random(10);
  if(posOnWall > 100){
    lateralSpeed *= -1; 
  } 
  float x=0,y=0, xs=0,ys=0;
  int r =   int(random(4));
  if(r == 0){ //leftwall
    x = -5;
    y = posOnWall;
    xs = mainSpeed;
    ys = lateralSpeed;
  }
  if(r == 1){ //rightwall
    x = 400+5;
    y = posOnWall;
    xs = -1*mainSpeed;
    ys = lateralSpeed;
  }
  if(r == 2){ //topwall
    x = posOnWall;
    y = -5;
    xs = lateralSpeed;
    ys = mainSpeed;
  }
  if(r == 3){ //topwall
    x = posOnWall;
    y = 400+5;
    xs = lateralSpeed;
    ys = -1* mainSpeed;
  }


  frog f = new frog(round(x),round(y),"froglive.gif");
  f.xs = xs;
  f.ys = ys;
  
  frogs.add(f);
}