Juggling Game

This is a simple jugging game I created for this week’s assignment. I wanted to replace the 2 circles with images of circus balls but I having problems. I also couldn’t get them to rotate.

I started with the Example code in Processing for BouncyBubbles and I built the game on top of that.

/* This stetch will produce a little juggling game */

//int numBalls = 2;
int numBalls = 3;
float spring = 0.05;
float gravity = 0.03;
float friction = -0.9;
Ball[] balls = new Ball[numBalls];

int gameLength = 30; //how long the game will last in seconds

int timer; //time in seconds
int counter = 0;
int timedScore;
int savedTimeScore;
int ballsUpStartTime;
//int ballCounter = 0; //number of balls in the air

void setup() { 
  size(400, 700);
  noStroke();
  smooth();

  for (int i = 0; i < numBalls; i++) {
    balls[i] = new Ball(random(width), height, random(20, 40), i, balls);
  }
}

void draw() {

  background(0);
  for (int i = 0; i < numBalls; i++) {
    balls[i].collide();
    balls[i].move();
    balls[i].display();
  }
  //set the countdown timer
  timer = gameLength - int(millis()/1000);
  text ("Time left: " + timer, 20, 10);

  //set the ball counter = number of balls in the air
  int ballCounter=0;
  for (int i=0; i<numBalls; i++) {
    if (balls[i].onTheFloor() == false) {
      ballCounter++;
    }
  }

  if (ballCounter == balls.length) {
    //reset the time counter
    println("All BALLS UP!");
    
    //start timing
    //timedScore += int(frameCount /60);
    ballsUpStartTime = int(millis()/1000);
    println("millis/1000 "+int(millis()/1000));
    timedScore = int(millis() /1000) - ballsUpStartTime;
    println("timedScore : "+timedScore);
  }else { // if there's a ball on the ground, save the time
    //check if the time is bigger that the other time
    if (timedScore > savedTimeScore){
      savedTimeScore = timedScore;
    }
    
    timedScore = 0;
  }

  text ("Balls in the Air: " + ballCounter, 10, 50);

  if (timer == 0) {
    noLoop();
    background(0);
    fill(150);
    text("Your top score: "+ savedTimeScore, width/2, height/2);
  }
}// end draw



void mousePressed() {
  for (int i = 0; i < numBalls; i++) {
    balls[i].collideWMouse(mouseX, mouseY);
  }
}
class Ball {
  float x, y;
  float diameter = 50;
  float vx = 0;
  float vy = 0;
  int id;
  int ballRotation = 0;
  int push = 2;//for the on-click function
  Ball[] others;
  PImage b;

  boolean onTheFloor = true;

  Ball(float xin, float yin, float din, int idin, Ball[] oin) {
    x = xin;
    y = yin;
    id = idin;
    others = oin;
    b = loadImage("circusball.gif");
  } 

  void collide() {
    for (int i = id + 1; i < numBalls; i++) {
      float dx = others[i].x - x;
      float dy = others[i].y - y;
      float distance = sqrt(dx*dx + dy*dy);
      float minDist = others[i].diameter/2 + diameter/2;
      if (distance < minDist) { 
        float angle = atan2(dy, dx);
        float targetX = x + cos(angle) * minDist;
        float targetY = y + sin(angle) * minDist;
        float ax = (targetX - others[i].x) * spring;
        float ay = (targetY - others[i].y) * spring;
        vx -= ax;
        vy -= ay;
        others[i].vx += ax;
        others[i].vy += ay;
      }
    }
  }

  void collideWMouse(int mousePosX, int mousePosY) {

    if (mousePosX >x - diameter/2 && mousePosX < x + diameter/2 && mousePosY > y-diameter/2 && mousePosY < y + diameter/2) {
//      println("You hit Ball #" + id); 
//      println("on the Floor: " +onTheFloor());
//      println("Y: " +y);

      vy = -(Math.abs((vy+1) + push));
    }
  }

  void move() {
    vy += gravity;
    x += vx;
    y += vy;
//    this.rotate(ballRotation++);
    if (x + diameter/2 > width) {
      x = width - diameter/2;
      vx *= friction;
    }
    else if (x - diameter/2 < 0) {
      x = diameter/2;
      vx *= friction;
    }
    if (y + diameter/2 > height) {
      y = height - diameter/2;
      vy *= 0; 
      fill(255, 0, 0);
    } 
    else if (y - diameter/2 < 0) {
      y = diameter/2;
      vy *= friction;
    }
  }

  void display() {
    fill(255, 204);
    ellipse(x, y, diameter, diameter);
//    image(b, x, y, diameter, diameter);
  }

  boolean onTheFloor() {
    if (y + diameter/2 >= height) {
      onTheFloor = true;
    }
    else {
      onTheFloor = false;
    }
    return onTheFloor;
  }
}//end Ball class

Proudly powered by WordPress
Theme: Esquire by Matthew Buchanan.