Untitled
unknown
plain_text
9 months ago
4.9 kB
11
Indexable
***********************************************/
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class BouncingBall2 extends JPanel implements ActionListener {
private static final int TIMER_DELAY = 20;
private double ballX = 0;
private double ballY = 0;
private double ballVelocityY = 0;
private boolean isBouncing = false;
private Timer timer;
private double gravity = 0.5;
private double speedMultiplier = 1.0;
private ArrayList<double[]> path;
private JLabel speedLabel;
private JLabel positionLabel;
public BouncingBall2() {
timer = new Timer(TIMER_DELAY, this);
setPreferredSize(new Dimension(800, 600));
setBackground(Color.LIGHT_GRAY);
path = new ArrayList<>();
speedLabel = new JLabel("Speed: 1.00");
positionLabel = new JLabel("Position: (0.00, 0.00)");
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawBall(g);
drawPath(g);
}
private void drawBall(Graphics g) {
int ballSize = getBallSize();
int drawX = (int) (ballX * getWidth());
int drawY = (int) (ballY * getHeight());
g.setColor(Color.RED);
g.fillOval(drawX, drawY, ballSize, ballSize);
}
private void drawPath(Graphics g) {
g.setColor(Color.BLACK);
for (int i = 1; i < path.size(); i++) {
double[] prevLocation = path.get(i - 1);
double[] currentLocation = path.get(i);
g.drawLine((int) (prevLocation[0] * getWidth()), (int) (prevLocation[1] * getHeight()),
(int) (currentLocation[0] * getWidth()), (int) (currentLocation[1] * getHeight()));
}
}
private int getBallSize() {
return (int) (getHeight() * 0.05);
}
public void startBouncing() {
isBouncing = true;
path.clear();
timer.start();
}
public void stopBouncing() {
isBouncing = false;
timer.stop();
}
public void continueBouncing() {
isBouncing = true;
timer.start();
}
public void increaseSpeed() {
speedMultiplier = Math.min(2.0, speedMultiplier + 0.25);
updateSpeedLabel();
}
public void decreaseSpeed() {
speedMultiplier = Math.max(0.25, speedMultiplier - 0.25);
updateSpeedLabel();
}
public void resetBall() {
ballX = 0;
ballY = 0;
ballVelocityY = 0;
path.clear();
repaint();
}
private void updateSpeedLabel() {
speedLabel.setText("Speed: " + String.format("%.2f", speedMultiplier));
}
@Override
public void actionPerformed(ActionEvent e) {
if (isBouncing) {
updateBallPosition();
repaint();
}
}
private void updateBallPosition() {
ballVelocityY += gravity * speedMultiplier;
ballY += ballVelocityY * speedMultiplier / getHeight();
int ballSize = getBallSize();
if (ballY * getHeight() + ballSize > getHeight()) {
ballY = (getHeight() - ballSize) / (double) getHeight();
ballVelocityY = -ballVelocityY * 0.8;
}
ballX += 2 * speedMultiplier / getWidth();
if (ballX * getWidth() + ballSize > getWidth()) {
stopBouncing();
}
double centerX = ballX + (ballSize / (double) getWidth()) / 2;
double centerY = ballY + (ballSize / (double) getHeight()) / 2;
path.add(new double[]{centerX, centerY});
positionLabel.setText(String.format("Position: (%.2f, %.2f)", ballX, ballY));
}
public static void main(String[] args) {
JFrame frame = new JFrame("Bouncing Ball Simulation");
frame.setMinimumSize(new Dimension(700, 300));
BouncingBall2 bouncingBall = new BouncingBall2();
JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton continueButton = new JButton("Continue");
JButton fastButton = new JButton("Fast");
JButton slowButton = new JButton("Slow");
JButton resetButton = new JButton("Reset");
startButton.addActionListener(e -> bouncingBall.startBouncing());
stopButton.addActionListener(e -> bouncingBall.stopBouncing());
continueButton.addActionListener(e -> bouncingBall.continueBouncing());
fastButton.addActionListener(e -> bouncingBall.increaseSpeed());
slowButton.addActionListener(e -> bouncingBall.decreaseSpeed());
resetButton.addActionListener(e -> bouncingBall.resetBall());
JPanel buttonPanel = new JPanel();
buttonPanel.add(startButton);
buttonPanel.add(stopButton);
buttonPanel.add}}Editor is loading...
Leave a Comment