java实现花瓣飘落效果

效果:

在这里插入图片描述

代码:

package com.example.flowerdemo;

/**
 * @author ZhaoXu
 * @date 2023/1/17 15:07
 */

import javax.imageio.ImageIO;
import javax.swing.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author zhaoxu
 */
public class FlowerTest extends Applet implements MouseListener, Runnable {
    int xClick, yClick;
    static int panelLength = 1920;
    static int panelHeight = 1080;
    static int areaSize = 100;
    /**
     * 阻力加速度
     */
    static int f = 8;
    /**
     * 初速度
     */
    static int speedV0 = 40;
    static String imageStr64 = "iVBORw0KGgoAAAANSUhEUgAAACoAAAAWCAYAAAC2ew6NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMTgwMTE3NDA3MjA2ODExODIyQUY2RkM2MzQ2NTcyNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyQ0M3NzgwODI4QkQxMUU4QTk1N0QwMEMxRjNFMzNEMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyQ0M3NzgwNzI4QkQxMUU4QTk1N0QwMEMxRjNFMzNEMyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDE4MDExNzQwNzIwNjgxMTgyMkFGNkZDNjM0NjU3MjciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMTgyMkFGNkZDNjM0NjU3MjciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4cgh/2AAAHhklEQVR42qxXS4hlVxXd+3zu//2q6lV1ulsTQhJEHBkMhIzMSERocCItPbQHQTAQHWQScCooEURBFIOBBGJA0aAjIc7ET8AGQemkCel0MJ2kql71q3qf+znbtc99aWISTTfxwa373j3nnrP22mvtfYqvPPodevcjuFJryS+F2uM1dZaJrSFzsiY6NaHGY8Lbc6LMkzm9kzrvz/Obs/tM103D8eoOKzyhPBlR15VMwlTm7/Du+B+hSF+k/Rsv8uH8VZ4UhBWpGRQUzk6JphW5LKXQNDS7fo24YHLjEblJRcmwoMnkVMTm6DY/2J5Y6JPuraOnEnYP2zQhSfCsrEhCIOMsUZkSGQRZd3fSuruf1ssLQfhGyABY6OdY5QUs1d7OvrcHlJlME86lIfwgqbJPMFjhKo3oGQCN3hNH4nwESsgIGYMxZGC9HoL5c7Jan5P58V9Y5Lsk8jzWlP8r0IjlxvpJ79NH/XREPCqIErCJtBnryHhPATIR7ItwIkARYMCzkFjMK4k82AbrtBx/zi4Wz3EI32hX9fcpS3+N+c3HBqog7XH9Y5+kF83ZkkwKxhxeLXOyFt8TTwKNKT7RsUaiRMSanlmAJgfA3AE4Fizx7nCiZD5kVicPtdcXLwXvfgbt/FbIvvZhGMwt4Extx09B8BftGSw+yHFV8TJFHhmlLiDdloIRCm1DbdKDFODpMBwY4xTANJ47BJFhrFKwyMb2SAO/nxbzH6bSXrJt+yxmPXjrjEKPSNPEBfN0cmbnS2ZrQCbLwR60WBRgDJulLtaKgEoBp4MQpL3B3TEFXMqijosymWC+QvWu31XHsAf7lGyOyCpkh2XU1cfnxdJXRJpnic3jmPTG/wQKB+/BAr9Kp+MH7WkwCR2q3mhzZwWqWzP019YAZnrNaklTsOtWaUUwmJslsfZxioDAvLqHERSVWi5slIfFHAHzLCmJaU3Dqwvdav6pEKYPQyLzDweK0cSnv/Fnth8w0KEBAE2bmoXgdE0rNyhF0Kcg3QwJWKE+vdBoSCSaynS4AioqCBVIN5pMBa+Z8CYGSagSQbPBrcYFEiEhvMCQ0/rw1WJuTVgu6g8yKhJKX1XPue3tB3i8cWqiYlMiYQhEriCpyvrnMBHbXoFGa6debQuGwIymu8WL6wakeZQuBIExYEJwvpcC/hqsw1i7kzVA17HEhtUB1QevXzpYyYnJts44TZVsNOkbMUnnf+L2tj9vRtBkVUYtcVhFNwvYsdgk6MLoTqTlx9uoVaNuRjol2h2gWkBfU6wOUtq+7wGDNoigP5cAj++Eq+vWCBbaDyAC71G3AtYaa7VfrJezZ0bleOBETbPpOL7hb2d5eV4jV+BhuQKgFKnKY4opagwgHEd9htkxGV1YzaDGUO9kCCLWzY0nNdWMZxIo+M1vMbFM6U1NaFjT3yIjG4ORjzIpdu4ZJSH7Kq+6a+5oOqBJw5T/a/7lohg84c7uIi0ZdNX1zrR9INpdCMyFwxMK14/iXQMS7dyTAUWUNTaLQYQImLRrZUCUu+h2Y8Bu0oMmZRAa19Kl3cz6hNpm2ddcvGKLIdYEQUcnZFfyN9fiheZgfu94QT9Kdod4KY2bRkmouKExTQv6NjWvH1B7tMAG2GR7TIyDA+cZmRx6LNK+hcIEDMCid5gpanTWIaXL3ngDBJf7vuhnHNMvFmwbXBbspkxdje+UU7NAE9k/2ZfaPubsVkXZa/vfAvd7wdRkl2DKoPuo0B0AwDTdYgUWF0gT+sZ0TGZnHMFHdlR71kVbUKydyprdGJNiM4jpbcHOqkYQmINLDgHiOoLIGxhUu1cXS6xVyZkBvNCSb7HfaPDI7Mrll919h4HSnVOXeYDuofoosGlhei2qgeYr6g6h1WEV+zsrG8qwlioFqkD04KHdSWvlu9VDwcIw0WDIUFx3kPWmwlisDlGoEI9qX9/UEmc4ZkN8F6TyX1/P9p+PHBgoult092SDbaIRXI4UkhoatTNwf4Yw0yLqLWoSOo0gmfsj38YAqt+4UazsHPu/nqgIpYz1twaoABSPMq8tVs2kEtPxHifFomvkZUjwm6ivL+jRse9MRV4lKX+B0Mooz/oDRtf0OrEJmb1hX4q4b4nxUBbZBCtIaaypKgB1e9xNor7jrtpaNXDagJM+CA0m6lV/mtgGwCCrES+Jtc9g7KfQ9+F7T6yu/vOlC+nZO+8SdKCQrKmeLcnCKHZ3Qj7ZuDQySCsARSVE47Zqce2dot8S0RYTc75Jn+1P15r26GLTp7QXbf8ofqzMAfnvmPcHrPM7dKs/Ya1GNU3vO6W6d66+cvHk4IC2zN1kFntkRqfJDqobXCT/BBsvUen/ikp/GTu9jY1OrDdoOxbdGK1GbWBtib5fiQtD3LeQqjG3MgKsIUCUoCzZwNSCuQRbB/j+BjR1Beu9gk54NWi5auUD4P4D6PCu3WvFLP8s10hROfql+/Qdv7B74z9CP1dFQ/fq0vetIO+5y4ZILWXKZKfCpv7QfPMgyT1Us5kb5Kbpbq7xUSf8/DN3f625XD+9rtvfV2X6PXVyfE/TpukTvsV/AT5i01sE9N8+/xZgAEMRLTup79BPAAAAAElFTkSuQmCC";

    FlowerTest() {
        addMouseListener(this);
    }

    @Override
    public void paint(Graphics g) {
//        BufferedImage image = null;
//        try {
//            image = ImageIO.read(new FileInputStream("src\\main\\resources\\backGround.png"));
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//        getGraphics().drawImage(image, 0, 0, getSize().width, getSize().height, this);
        super.paint(g);
    }

    @Override
    public void paintComponents(Graphics g) {
        super.paintComponents(g);
    }

    /**
     * 使该程序能够作为应用程序执行。
     */
    public static void main(String args[]) {
        FlowerTest FlowerTest = new FlowerTest();
        JFrame frame = new JFrame("FlowerTest by:zx");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.getContentPane().add(FlowerTest, BorderLayout.CENTER);
        frame.setSize(panelLength, panelHeight);
        //背景色黑色
        FlowerTest.setBackground(Color.BLACK);
        FlowerTest.init();
        FlowerTest.start();
        frame.setVisible(true);

    }

    /**
     * 点击会产生一个线程来执行烟花升空
     */
    public void run() {
        //需要一个线程级变量来存储单个线程的坐标
        double threadx = Math.random() * panelLength;
        double thready = 0;
        // 旋转角度
        int speed = (int) (Math.random() * (4 + 4 + 1)) - 4;
        // 速率
//        int speed = (int) (Math.random() * (3 + 3 + 1)) - 3;
        while (speed == 0) {
            speed = (int) (Math.random() * (4 + 4 + 1)) - 4;
        }
        //新建一个Graphics变量
        Graphics graphics = getGraphics();
        BufferedImage image = null;
        try {
            image = ImageIO.read(new FileInputStream("src\\main\\resources\\flower.png"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        double moveTimesx = 0;
        double moveTimesy = 0;
        double nowy = thready;
        double nowx = threadx;

        while (panelHeight >= nowy || nowx <= panelLength) {
            moveTimesx++;
            moveTimesy++;
            nowy = thready + Math.abs(speed * moveTimesy);
            if (nowx >= 0 && nowx <= panelLength - 50) {
                nowx = threadx + speed * moveTimesx;
            } else {
                threadx = nowx < 0 ? 0 : panelLength - 50;
                moveTimesx = 0;
                nowx = 0;
                speed = -speed;
                continue;
            }
            BufferedImage newImage = rotate(image, (int) (speed * moveTimesy));
            graphics.drawImage(newImage, (int) nowx, (int) nowy, null);
//            if (nowy < 0 || nowy > panelHeight - 50) {
//                break;
//            }
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            graphics.clearRect((int) nowx, (int) nowy, newImage.getWidth(), newImage.getHeight());
        }
    }

    public void mouseClicked(MouseEvent e) {

    }

    /**
     * 监听鼠标按键
     *
     * @param e
     */
    public void mousePressed(MouseEvent e) {
        xClick = e.getX();
        yClick = e.getY();
        while (true) {
            Thread thread = new Thread(this);
            thread.start();
            try {
                Thread.sleep(1200);
            } catch (InterruptedException ex) {
                throw new RuntimeException(ex);
            }
        }
    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseExited(MouseEvent e) {

    }

    /**
     * 对图片进行旋转
     *
     * @param src   被旋转图片
     * @param angel 旋转角度
     * @return 旋转后的图片
     */
    public static BufferedImage rotate(Image src, int angel) {
        angel = Math.abs(angel);
        int src_width = src.getWidth(null);
        int src_height = src.getHeight(null);
        // 计算旋转后图片的尺寸
        Rectangle rect_des = calcRotatedSize(new Rectangle(new Dimension(
                src_width, src_height)), angel);
        BufferedImage res = null;
        res = new BufferedImage(rect_des.width, rect_des.height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = res.createGraphics();
        // 进行转换
        g2.translate((rect_des.width - src_width) / 2,
                (rect_des.height - src_height) / 2);
        g2.rotate(Math.toRadians(angel), src_width / 2.0, src_height / 2.0);

        g2.drawImage(src, null, null);
        return res;
    }

    /**
     * 计算旋转后的图片
     *
     * @param src   被旋转的图片
     * @param angel 旋转角度
     * @return 旋转后的图片
     */
    public static Rectangle calcRotatedSize(Rectangle src, int angel) {
        // 如果旋转的角度大于90度做相应的转换
        if (Math.abs(angel) >= 90) {
            if (Math.abs(angel) / 90 % 2 == 1) {
                int temp = src.height;
                src.height = src.width;
                src.width = temp;
            }
            angel = Math.abs(angel) % 90;
            if (angel < 0) {
                angel = -angel;
            }
        }

        double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2;
        double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;
        double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2;
        double angel_dalta_width = Math.atan((double) src.height / src.width);
        double angel_dalta_height = Math.atan((double) src.width / src.height);

        int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha
                - angel_dalta_width));
        int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha
                - angel_dalta_height));
        int des_width = src.width + len_dalta_width * 2;
        int des_height = src.height + len_dalta_height * 2;
        return new Rectangle(new Dimension(des_width, des_height));
    }
}

版权声明:本文为qq_39898191原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。