效果:

代码:
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+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMTgwMTE3NDA3MjA2ODExODIyQUY2RkM2MzQ2NTcyNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyQ0M3NzgwODI4QkQxMUU4QTk1N0QwMEMxRjNFMzNEMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyQ0M3NzgwNzI4QkQxMUU4QTk1N0QwMEMxRjNFMzNEMyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDE4MDExNzQwNzIwNjgxMTgyMkFGNkZDNjM0NjU3MjciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMTgyMkFGNkZDNjM0NjU3MjciLz4gPC9yZGY6RGVzY3Jp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";
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版权协议,转载请附上原文出处链接和本声明。