import processing.core.*; 
import processing.xml.*; 

import java.applet.*; 
import java.awt.Dimension; 
import java.awt.Frame; 
import java.awt.event.MouseEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.FocusEvent; 
import java.awt.Image; 
import java.io.*; 
import java.net.*; 
import java.text.*; 
import java.util.*; 
import java.util.zip.*; 
import java.util.regex.*; 

public class BallGame extends PApplet {

// Changed within draw
int ballPos ;
int timesDrawCalledSinceLastHit ;
int ballSpeed ;
int numClicks ;
int numHits ;

// Assigned values in setup and never changed
int ballStartPos ;
int ballEndPos ;
int ballSize ;

public void setup() {
  size(800, 100) ;
  ballSize = PApplet.parseInt(height*0.8f) ;
  ballStartPos = -ballSize/2 - 30 ;
  ballEndPos   = width + ballSize/2 ;
  ballPos = ballStartPos ;
  ballSpeed = 1 ;
  numClicks = 0 ;
  numHits = 0 ;
  timesDrawCalledSinceLastHit = 1000000 ;
}

public void draw() {
  ++timesDrawCalledSinceLastHit ;
  background(0, map(numHits, 0, numClicks, 0, 255), 0) ;
  if (timesDrawCalledSinceLastHit < 10) {
    fill(255, 255, 0) ;
  } else {
    fill(255,0,0) ;
  }
  ellipse(ballPos, height/2, ballSize, ballSize) ;
  ballPos += ballSpeed ;
  if (ballPos >= ballEndPos) {
    ballPos = ballStartPos ;
  }
}

public void mousePressed() {
  ++numClicks ;
  if (dist(ballPos, height/2, mouseX, mouseY) <= ballSize/2) {
    ++numHits ;
    timesDrawCalledSinceLastHit = 0 ;
  }
}

public void keyPressed() {
  if (key == 'u' || key == 'U') {
    ballSpeed += 1 ;
  } else if ((key == 'd' || key == 'D') && ballSpeed > 1) {
    ballSpeed -= 1 ;
  }
}

  static public void main(String args[]) {
    PApplet.main(new String[] { "--bgcolor=#DFDFDF", "BallGame" });
  }
}
