【JAVA】重力反弹,反弹高次一次比一次低

2023-12-21 03:25:43

本来是想实现泡泡屏保(javascript实现漂亮的气泡碰撞效果(Chrome浏览器下更佳) 下载-脚本之家)的,还未实现?

import javax.swing.*;
import java.awt.*;
import java.util.LinkedList;
import java.util.Random;

class Bubble
{
    public static Image image;
    public int x;
    public int y;
    public int displayWidth;
    public int displayHeight;
    public int gravity;

    public double bounce;

    public Bubble(String image, int x, int y, int displayWidth, int displayHeight) {
        this.image = Toolkit.getDefaultToolkit().getImage("src//" + image);
        this.x = x;
        this.y = y;
        this.displayWidth = displayWidth;
        this.displayHeight = displayHeight;
        gravity = 1;

        bounce = 0.9;

    }

    public void move()
    {
    }

    @Override
    public String toString() {
        return "Bubble{" +
                "x=" + x +
                ", y=" + y +
                ", displayWidth=" + displayWidth +
                ", displayHeight=" + displayHeight +
                '}';
    }
}

public class MainFrame extends JFrame implements Runnable {
    Graphics graphics;
    Image image;

    int x;
    int y;
    private final int windowWidth;//画板的宽度
    private final int windowHeight;//画板的高度
    private LinkedList<Bubble> bubbleLinkedList;

    private double ballsnum= 5;   // 小球数目
    private double spring= 0.8;   // 弹力加速度
    private double bounce= -0.95; // 反弹
    private double gravity= 0.1;  // 重力

    {
        setLayout(null);
        windowWidth = 629;
        windowHeight = 990;
        setSize(windowWidth, windowHeight);
        setLocationRelativeTo(null);
        setVisible(true);
        graphics = getContentPane().getGraphics();
    }

    MainFrame()
    {
        bubbleLinkedList = new LinkedList<>();
        for (int i = 0; i < 1; i++) {

            Integer x = new Random().nextInt(windowWidth / 10);
            Integer y = new Random().nextInt(windowHeight / 20);
            bubbleLinkedList.add(new Bubble("background.jpg", x, y, 20, 20));
        }
    }

    @Override
    public void run() {
        while (true)
        {
            for (Bubble b: bubbleLinkedList) {
                graphics.drawImage(b.image, b.x, b.y, b.displayWidth, b.displayHeight, this);
                BulletHit();
                b.move();
            }

            y+=10;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public void move(Bubble bubble)
    {
        gravity += 2;
        bubble.x += 2;
        bubble.y += gravity;
        System.out.println(bubble.x + ": " + bubble.y + ": " + bubble.displayHeight + ": " + windowHeight);
        if (bubble.y + bubble.displayHeight > windowHeight)
        {
            bubble.y = windowHeight  - bubble.displayHeight;
            gravity *= -0.8;
        }
    }

    public void BulletHit()
    {
        for (Bubble bubble0: bubbleLinkedList)
        {
            for (Bubble bubble1: bubbleLinkedList)
            {
                if (!bubble0.equals(bubble1))
                {
                    double x = Math.abs(bubble0.x - bubble1.x);
                    double x0 = bubble0.x - bubble1.x;
                    double y = Math.abs(bubble0.y - bubble1.y);
                    double y0 = bubble0.y - bubble1.y;
                    double dist = Math.sqrt(x * x + y * y);
                    if (dist <= bubble0.displayWidth)
                    {
                        double angle = Math.atan2(y0, x0);
                        double tx = bubble0.x + Math.cos(angle) * dist;
                        double ty = bubble0.y + Math.sin(angle) * dist;
                        double ax = (tx - bubble1.x) * spring;
                        double ay = (ty - bubble1.y) * spring;

                        bubble0.x -= ax;
                        bubble0.y -= ay;
                        bubble1.x -= ax;
                        bubble1.y -= ay;
                    }
                }
            }
        }

        for (Bubble bubble0: bubbleLinkedList)
        {
            move(bubble0);
        }
    }

    public static void main(String[] args) {
        MainFrame mainFrame = new MainFrame();
        new Thread(mainFrame).start();
    }
}

文章来源:https://blog.csdn.net/r77683962/article/details/135119490
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。