markqvist_MidiKatapult/Animation.pde
class MText extends Object {
  float x;
  float y;
  int endx;
  int endy;
  int startx;
  int starty;
  int duration;
  int step;
  boolean animate = false;
  boolean done = false;
  String text;
  
  MText(String text, int x, int y) {
    this.x = (float)x;
    this.y = (float)y;
    this.startx = x;
    this.starty = y;
    this.text = text;
  }
  
  void animate() {
    animate = true;
  }
  
  void setDuration(int duration) {
    this.duration = duration;
  }
  
  void setDestination(int x, int y) {
    endx = x;
    endy = y;
  }
  
  boolean isDone() {
    return done;
  }
  
  void draw() {
    if (step < duration) {
      x = (x + ((float)(endx-startx)/(float)duration));
      y = (y + ((float)(endy-starty)/(float)duration));
      step++;
      if (step == duration) done = true;
    }
    if (animate) {
      fill(#FFFFFF);
      textFont(f40, 40);
      textAlign(CENTER);
      smooth();
      text(text, (int)x, (int)y);
    }
  }
  
}

class MLine extends Object {
  float x;
  float y;
  int endx;
  int endy;
  int startx;
  int starty;
  int duration;
  int step;
  boolean animate = false;
  boolean done = false;
  
  MLine(int x, int y) {
    this.x = (float)x;
    this.y = (float)y;
    this.startx = x;
    this.starty = y;
  }
  
  void animate() {
    animate = true;
  }
  
  void setDuration(int duration) {
    this.duration = duration;
  }
  
  void setDestination(int x, int y) {
    endx = x;
    endy = y;
  }
  
  boolean isDone() {
    return done;
  }
  
  void draw() {
    if (step < duration) {
      x = (x + ((float)(endx-startx)/(float)duration));
      y = (y + ((float)(endy-starty)/(float)duration));
      step++;
      if (step == duration) done = true;
    }
    if (animate) {
      stroke(#FFFFFF);
      smooth();
      line(startx, starty, x, y);
    }
  }
  
}

void sleep(int m) {
  float now = millis();
  while(millis() < now + (float)m) {
    
  }
}
