Computer Science 225
Advanced Programming
Spring 2017, Siena College
BetterBallDropper BlueJ Project
Click here to download a BlueJ project for BetterBallDropper.
BetterBallDropper Source Code
The Java source code for BetterBallDropper is below. Click on a file name to download it.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.Timer;
/**
* Example BetterBallDropper: a program that drops multiple ball
* objects
*
* Jim Teresco, Siena College, Computer Science 225, Spring 2017
*
* $Id: templateapp.java 2975 2016-08-30 02:35:29Z terescoj $
*/
public class BallDropper extends JFrame implements MouseListener {
private static final int WINDOW_SIZE = 400;
private static final int TIMER_DELAY = 30;
/** list of falling balls */
private ArrayList<FallingBall> balls = new ArrayList<>();
/**
* construct a BallDropper frame
*/
public BallDropper() {
// set window properties
setSize(WINDOW_SIZE, WINDOW_SIZE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
addMouseListener(this);
// create and start the timer that will repaint periodically
Timer t = new Timer(TIMER_DELAY,
new ActionListener() {
// the timer will wake up and call this method every
// TIMER_DELAY milliseconds.
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
});
t.start();
}
/**
* paint contents of our frame
*
* @param g Graphics object on which to draw
*/
@Override
public void paint(Graphics g) {
g.setColor(Color.white);
g.fillRect(0, 0, WINDOW_SIZE, WINDOW_SIZE);
g.setColor(Color.black);
for (FallingBall fb : balls) {
fb.paint(g);
}
}
/**
* mouse listener to create a new ball on each mouse press
*
* @param e mouse event information
*/
@Override
public void mousePressed(MouseEvent e) {
balls.add(new FallingBall(e.getX(), e.getY(), WINDOW_SIZE));
}
// remaining methods for MouseListener
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
/**
* simple main method to allow this class to be run as an application
*
* @param args not used
*/
public static void main(String[] args) {
new BallDropper();
}
}
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
/**
* A Falling Ball that manages its own animation
*
* @author Jim Teresco
*/
public class FallingBall extends Thread {
private static final int BALL_SIZE = 50;
//private static final int VELOCITY = 2;
private static final long PAUSE_TIME = 15;
private static Random r = new Random();
/** current ball position (upper left corner of bounding box) */
private double x, y;
/** how far the ball can fall */
private int yMax;
/** color of this ball */
private Color c;
/** x "side to side" velocity */
private double xSpeed;
/** y velocity */
private double ySpeed = 1.0;
/**
* construct a FallingBall and start its animation
*
* @param x x-coordinate of the center of the ball
* @param y y-coordinate of the top of the ball
* @param yMax the y-coordinate of the bottom of the window
*/
public FallingBall(int x, int y, int yMax) {
// set initial position of this ball
this.x = x - BALL_SIZE/2;
this.y = y;
this.yMax = yMax;
c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
xSpeed = 0;
start();
}
/**
* thread run method: move the ball periodically
*/
public void run() {
while (true) {
try {
sleep(PAUSE_TIME);
}
catch (InterruptedException e) {}
// move the ball according to current velocity components
y += ySpeed;
x += xSpeed;
// bounce off the floor! include some damping so
// we stop bouncing eventually
if (y + BALL_SIZE > yMax) {
y = yMax - BALL_SIZE;
ySpeed = -ySpeed * 0.75;
}
// accelerate a bit left and right and some down to
// simulate gravity
xSpeed += r.nextDouble()*0.25 - 0.125;
ySpeed += .01;
}
}
/**
* paint this item on the given Graphics area
*
* @param g Graphics area on which to draw
*/
public void paint(Graphics g) {
g.setColor(c);
g.fillOval((int)x, (int)y, BALL_SIZE, BALL_SIZE);
}
}