Bounce
<< Sound Stuff | FinalProjectsTrailIndex | Billiards >>
Rather than respond to a action from a user, in this demo, a timer generates an event that makes the ball move. We don't load an image file, but instead draw graphics. We do load a sound file, though, so you'll need to download the sound file boing.wav and Set the default size to 800 by 600 (In Eclipse Properties->Run/Debug Settings->Bounce: Edit ->Parameters).
Ball.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
public class Ball {
private int x;
private int y;
private int radius;
private int rise;
private int run;
private boolean visable;
public Ball(int radius){
x=randInt(350,450);
y=randInt(250,350);
this.radius=radius;
rise=randInt(1,8);
run=randInt(-8,8);
setVisable(false);
}
public int randInt(int min, int max){
return min+(int)((max-min)*Math.random());
}
public void move(){
x+=run;
y+=rise;
}
public void bounceVertical(){
rise*=-1;
}
public void bounceHorizontal(){
run*=-1;
}
public void draw(Graphics g){
if (visable){
Color c=g.getColor();
g.setColor(Color.BLUE);
g.fillOval(x-radius, y-radius, 2*radius, 2*radius);
g.setColor(c);
}
}
public void setVisable(boolean visable) {
this.visable = visable;
}
public boolean isVisable() {
return visable;
}
public Rectangle2D area(){
return new Rectangle2D.Double(x-radius, y-radius, 2*radius, 2*radius);
}
public void setRise(int rise){ this.rise=rise;}
public void setRun(int run){ this.run=run;}
public int getRise(){return rise;}
public int getRun(){return run;}
}
Wall.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
public class Wall {
private Rectangle2D.Double rect;
private Color color;
private int x,y,width,height;
public Wall(int x, int y, int width, int height){
rect=new Rectangle2D.Double(x, y, width, height);
this.x=x;
this.y=y;
this.width=width;
this.height=height;
setColor(Color.BLACK);
}
public boolean touches(Ball ball){
return rect.intersects(ball.area());
}
public void draw(Graphics g){
Color c=g.getColor();
g.setColor(color);
g.fillRect(x, y, width, height);
g.setColor(c);
}
public void setColor(Color color) {
this.color = color;
}
public Color getColor() {
return color;
}
}
Sound.java
import java.applet.*;
import java.net.URL;
public class Sound{
private AudioClip clip;
public Sound(String fileName, Applet a){
URL soundToPlay = getClass().getResource(fileName);
clip = a.getAudioClip(soundToPlay);
}
public void play(){
clip.play();
}
public void loop(){
clip.loop();
}
}
Bounce.java
/**
* A Sample Animation with a Restart button
*
* @author Fr Chris Thiel, OFMCap
* @version 12 May 2011
*/
import java.awt.event.*;
import java.applet.Applet;
import java.awt.*;
import java.io.IOException;
import javax.swing.*;
public class Bounce extends Applet implements ActionListener
{
Sound boing;
Timer timer;
Image virtualMem;
Graphics gBuffer;
Ball ball;
Wall top,bottom,left,right;
int appletWidth;
int appletHeight;
int frame;
int lastFrame;
Button myButton;
int count;
// OUR CLASS IS A SUBCLASS OF APPLET
/**
* this init() method will be run at the beginning
* and where we create the Listeners
*/
public void init()
{
boing = new Sound("boing.wav",this);
ball = new Ball(10);
top = new Wall(0,0,800,10);
bottom = new Wall(0,590,800,10);
left = new Wall(0,10,10,590);
right = new Wall(790,10,10,590);
appletWidth = getWidth();
appletHeight = getHeight();
frame=0;
timer=new Timer(1, this);
lastFrame=appletWidth;
virtualMem = createImage(appletWidth,appletHeight);
gBuffer = virtualMem.getGraphics();
gBuffer.setColor(Color.white);
gBuffer.fillRect(0,0,appletWidth,appletHeight);
count=0;
myButton= new Button("Do It Again");
//the class is its own button listener
myButton.addActionListener (this);
add(myButton);
}
public void paint(Graphics g)
{
//We draw using the object methods of
// the graphics buffer, not what is
// currently on the screen
gBuffer.setColor(Color.white);
gBuffer.fillRect(0,0,appletWidth,appletHeight);gBuffer.setColor(Color.black);
gBuffer.setColor(Color.black);
gBuffer.drawString("Frame "+frame, 20,20);
gBuffer.drawString(count+" bounces", 20, 35);
ball.draw(gBuffer);
top.draw(gBuffer);
bottom.draw(gBuffer);
left.draw(gBuffer);
right.draw(gBuffer);
//Now we send the result to the screen
g.drawImage(virtualMem,0,0,this);
}
public void update(Graphics g)
{
paint(g); //get rid of flicker with this method
}
/**
* ActionListener is an interface and
* requires the actionPerformed() method
* to be defined..in this case we
* look for a restart button being pressed
*/
public void actionPerformed(ActionEvent e){
Object source = e.getSource();
if (source == timer) {
frame++;
frame%=100;
ball.move();
if (top.touches(ball) || bottom.touches(ball)){
ball.bounceVertical();
boing.play();
count++;
}
if (left.touches(ball) || right.touches(ball)){
ball.bounceHorizontal();
boing.play();
count++;
}
}
else {//restart button pressed
frame=0;
if (timer.isRunning()) {
timer.stop();
myButton.setLabel("Start");
ball.setVisable(false);
count=0;
} else {
timer.start();
myButton.setLabel("Stop");
ball=new Ball(10);
ball.setVisable(true);
boing.play();
}
}
repaint();
}
}
