Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Main extends Applet {
- private final int N = 3;
- private Ball[] balls = new Ball[N];
- private boolean flag = true;
- public void paint(Graphics g){
- g.setColor(Color.green);
- g.fillRect(0,0,this.getWidth(),this.getHeight());
- if(flag) {
- for(int i = 0; i < N; i++) {
- balls[i] = new Ball(this);
- balls[i].start();
- }
- try {
- Thread.sleep(0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- flag = false;
- }
- g.dispose();
- }
- }
- public class Ball extends Thread {
- private Graphics2D g2d, buffGraphics;
- private Shape ball;
- private AffineTransform ballTransform = new AffineTransform();
- private BufferedImage bi;
- private Color color;
- private double width, height, deltaY, deltaX = 0.011;
- private final int rad = 20, diam = 2 * rad;
- Ball(Applet applet){
- bi = new BufferedImage(applet.getWidth(), applet.getHeight(), BufferedImage.TYPE_INT_ARGB);
- buffGraphics = bi.createGraphics();
- g2d = (Graphics2D)applet.getGraphics();
- g2d.setColor(Color.green);
- color = new Color((int)(Math.random() * 255),(int)(Math.random() * 255), (int)(Math.random() * 255) );
- ball = new Ellipse2D.Double(Math.random() * (applet.getWidth() - diam),
- Math.random() * (applet.getHeight() - diam),diam,diam);
- double h = 8 + Math.random() * 9;
- double temp = Math.random();
- double hX = PositiveOrNegative() * ((int)(temp * (h + 1)) == (int) h ? h : temp * h);
- double hY = PositiveOrNegative() * Math.sqrt(h * h - hX * hX);
- ballTransform.setToTranslation(hX, hY);
- deltaY = Math.abs(hY / (hX / deltaX));
- width = applet.getWidth();
- height = applet.getHeight();
- }
- private static int PositiveOrNegative()
- {
- return (Math.random() >= 0.5) ? 1 : -1;
- }
- @Override
- public void run() {
- buffGraphics.setColor(color);
- buffGraphics.fill(ball);
- g2d.drawImage(bi, 0 , 0, null);
- while(true) {
- try {
- if(ball.getBounds().x + diam == width || ball.getBounds().x == 0)
- ballTransform.setToTranslation(-ballTransform.getTranslateX(), ballTransform.getTranslateY());
- else if(ball.getBounds().x + diam + ballTransform.getTranslateX() > width
- && ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) == 1) {
- double hx = width - ball.getBounds().x - diam - 1,
- hy = hx * Math.abs(ballTransform.getTranslateY()) / ballTransform.getTranslateX();
- AffineTransform af1 = new AffineTransform();
- af1.setToTranslation(hx,ballTransform.getTranslateY() / Math.abs(ballTransform.getTranslateY()) * hy);
- Thread.sleep(30);
- draw();
- ballTransform.setToTranslation(-ballTransform.getTranslateX(), ballTransform.getTranslateY());
- }
- else if(ball.getBounds().x + ballTransform.getTranslateX() < 0
- && ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) == -1) {
- double hx = ball.getBounds().x + 1,
- hy = hx * Math.abs(ballTransform.getTranslateY()) / ballTransform.getTranslateX() * (-1);
- AffineTransform af1 = new AffineTransform();
- af1.setToTranslation( -hx,ballTransform.getTranslateY() / Math.abs(ballTransform.getTranslateY()) * hy);
- Thread.sleep(30);
- draw();
- ballTransform.setToTranslation(-ballTransform.getTranslateX(), ballTransform.getTranslateY());
- }
- if(ball.getBounds().y + diam == height || ball.getBounds().y == 0)
- ballTransform.setToTranslation(ballTransform.getTranslateX(), -ballTransform.getTranslateY());
- else if(ball.getBounds().y + diam + ballTransform.getTranslateY() > height
- && ballTransform.getTranslateY() / Math.abs(ballTransform.getTranslateY()) == 1) {
- double hy = height - ball.getBounds().y - diam - 1,
- hx = hy * Math.abs(ballTransform.getTranslateX()) / ballTransform.getTranslateY();
- AffineTransform af1 = new AffineTransform();
- af1.setToTranslation(ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) * hx, hy);
- Thread.sleep(30);
- draw();
- ballTransform.setToTranslation(ballTransform.getTranslateX(), -ballTransform.getTranslateY());
- }
- else if(ball.getBounds().y + ballTransform.getTranslateY() < 0
- && ballTransform.getTranslateY() / Math.abs(ballTransform.getTranslateY()) == -1) {
- double hy = ball.getBounds().y + 1,
- hx = hy * Math.abs(ballTransform.getTranslateX()) / ballTransform.getTranslateY() * (-1);
- AffineTransform af1 = new AffineTransform();
- af1.setToTranslation(ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) * hx, -hy);
- Thread.sleep(30);
- draw();
- ballTransform.setToTranslation(ballTransform.getTranslateX(), -ballTransform.getTranslateY());
- }
- Thread.sleep(60);
- draw();
- if(Math.abs(ballTransform.getTranslateX()) - deltaX <= 0 ||
- Math.abs(ballTransform.getTranslateY()) - deltaY <= 0) break;
- ballTransform.setToTranslation(ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) *
- (Math.abs(ballTransform.getTranslateX()) - deltaX), ballTransform.getTranslateY() /
- Math.abs(ballTransform.getTranslateY()) * (Math.abs(ballTransform.getTranslateY()) - deltaY));
- deltaX += 0.0015;
- deltaY = Math.abs(ballTransform.getTranslateY() / (ballTransform.getTranslateX() / deltaX));
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- while(true) {
- try {
- Thread.sleep(60);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- g2d.drawImage(bi, 0, 0, null);
- }
- }
- private void draw(){
- g2d.fillOval(ball.getBounds().x-1,ball.getBounds().y-1,
- ball.getBounds().width+2, ball.getBounds().height+2);
- buffGraphics.setColor(Color.green);
- buffGraphics.setComposite(AlphaComposite.Clear);
- buffGraphics.fillOval(ball.getBounds().x-1,ball.getBounds().y-1,
- ball.getBounds().width+2, ball.getBounds().height+2);
- buffGraphics.setComposite(AlphaComposite.SrcOver);
- buffGraphics.setColor(color);
- ball = ballTransform.createTransformedShape(ball);
- buffGraphics.fill(ball);
- g2d.drawImage(bi, 0 , 0, null);
- }
- }
Add Comment
Please, Sign In to add comment