====== Bounce Example ======
Press the Button at the top to start and stop a ball that bounces and different angles
{{::screenshot_2023-05-15_at_6.13.35_am.png?400|}}
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;
}
}
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;}
}
/**
* A Sample Animation with a Restart button
*
* @author Fr Chris Thiel, OFMCap
* Applet version 12 May 2011
* Application Version May 12, 2023
*/
import java.awt.event.*;
import java.applet.Applet;
import java.awt.*;
import java.io.IOException;
import javax.swing.*;
public class Bounce extends JPanel implements ActionListener
{
//EasySound boing;
public static int WIDTH=800;
public static int HEIGHT=650;
private Timer timer;
//Image virtualMem;
//Graphics gBuffer;
private Ball ball;
private Wall top,bottom,left,right;
private int appletWidth;
private int appletHeight;
private int frame;
private int lastFrame;
private Button myButton;
private int count;
private EasySound boing;
public Bounce()
{
boing = new EasySound("boing.wav");
boing.play();
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;
count=0;
myButton= new Button("Do It Again");
//the class is its own button listener
myButton.addActionListener (this);
add(myButton);
}
public static void main(String[] args) {
Bounce app= new Bounce();
JFrame window = new JFrame("Bounce Example");
window.setSize(WIDTH, HEIGHT);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().add(app);
//window.addKeyListener(app);
//window.pack();
window.setVisible(true);
}
public void paintComponent(Graphics g)
{
//We draw using the object methods of
// the graphics buffer, not what is
// currently on the screen
super.paintComponent(g);
g.setColor(Color.white);
g.fillRect(0,0,appletWidth,appletHeight);
g.setColor(Color.black);
g.setColor(Color.black);
g.drawString("Frame "+frame, 20,20);
g.drawString(count+" bounces", 20, 35);
ball.draw(g);
top.draw(g);
bottom.draw(g);
left.draw(g);
right.draw(g);
//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();
}
}
[[https://mathorama.com/apcs/uploads/Main/boing.wav|bounce.wav]]