Java流星雨
系列文章
序号 | 直达链接 |
---|---|
1 | Java李峋同款可写字版跳动的爱心 |
2 | Java制作一个无法拒绝的表白界面 |
3 | Java满屏飘字代码 |
4 | Java满屏表白代码 |
5 | Java黑客帝国字母雨 |
6 | Java大雪纷飞 |
7 | Java方块圣诞树 |
8 | Java简单圣诞树 |
9 | Java心形曲线 |
10 | Java炫酷烟花 |
11 | Java精美圣诞树 |
12 | Java跨年烟花 |
13 | Java爱心泡泡 |
14 | Java球球大作战小游戏 |
15 | Java满天繁星 |
16 | Java漂浮爱心 |
17 | Java模拟星空 |
18 | Java蓝色跳动的爱心 |
19 | Java在线订餐系统 |
20 | Java鲜花商店系统 |
21 | Java书店管理系统 |
22 | Java汽车租贷系统 |
23 | Java自助取款系统① |
24 | Java自助取款系统② |
25 | Java数据挖掘系统 |
敬请期待…… |
写在前面
Java语言实现流星雨动画的完整代码。
技术需求
-
Java Swing 图形绘制:
- 继承
JPanel
并重写paintComponent(Graphics g)
方法进行自定义绘制。 - 使用
Graphics2D
进行高级绘图,如setStroke()
设置线条粗细、setColor()
设定颜色、drawLine()
画流星轨迹。
- 继承
-
定时动画 (
javax.swing.Timer
):使用Timer
以 30ms 间隔 触发ActionListener
,驱动流星运动并刷新界面。 -
面向对象编程(OOP):
Meteor
类封装流星的属性(位置、速度、颜色)和行为(移动、绘制、重置)。MeteorShower
作为流星管理器,控制多个Meteor
并实现动画。
-
数学计算(几何运动):采用 三角函数 (
Math.cos()
和Math.sin()
) 计算流星沿 30° 角 方向的运动轨迹。 -
颜色与随机性 (
java.util.Random
):- 生成随机长度、速度和位置,使流星运动多样化。
- 设定 蓝色调 RGB 颜色 (
Color(rand.nextInt(156) + 100, rand.nextInt(156) + 100, 255)
)。
-
事件驱动与 GUI 线程管理:通过
SwingUtilities.invokeLater()
确保 UI 操作在 事件调度线程 运行,避免 GUI 闪烁或卡顿。 -
Java AWT 2D 绘图优化:
BasicStroke(2)
设定流星线条宽度,使其更清晰。setBackground(Color.BLACK)
设定黑色背景,增强对比度。
-
窗口管理 (
JFrame
):JFrame
作为主窗口,添加MeteorShower
面板,设定尺寸 (setSize(1200, 800)
) 并启用关闭按钮 (setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
)。
完整代码
import javax.swing.*;
import java.awt.*;
import java.util.Random;
public class StarryVortex extends JPanel {
// 屏幕尺寸
private static final int WIDTH = 1200;
private static final int HEIGHT = 700;
// 粒子类
static class Particle {
double t; // 初始角度
double speed; // 角速度
double scale; // 半径
Color color; // 颜色
double x, y; // 粒子的位置
public Particle() {
Random rand = new Random();
t = rand.nextDouble() * 2 * Math.PI; // 随机初始角度
speed = rand.nextDouble() * 0.02; // 随机速度
scale = rand.nextDouble() * 999; // 随机轨迹半径
color = Color.WHITE; // 星星的颜色
updatePosition();
}
// 更新角度和位置
public void update() {
t += speed;
if (t > 2 * Math.PI) {
t -= 2 * Math.PI; // 重置角度
}
updatePosition();
}
// 更新粒子的位置
private void updatePosition() {
x = Math.cos(t) * scale;
y = Math.sin(t) * scale;
}
……
代码分析
这段 Java 代码实现了一个流星雨动画,利用 Swing
库进行图形绘制,并结合 Timer
控制流星的运动。下面我们对代码进行详细分析,涵盖其结构、关键技术点、运行原理。
1. 代码结构概述
代码主要由两个类组成:
Meteor
类:表示单个流星,控制其位置、速度、颜色、运动轨迹和重置逻辑。MeteorShower
类:继承JPanel
,用于管理所有流星并进行绘制和动画控制。
此外,main
方法位于 MeteorShower
类中,用于创建 JFrame
窗口并启动动画。
2. Meteor 类分析
Meteor
类用于表示单个流星,包含流星的基本属性和行为。
(1) 属性定义
x, y
:流星的当前位置坐标。length
:流星的长度(即尾迹长度)。speed
:流星的移动速度。color
:流星的颜色,这里选择了蓝色调。angle
:流星的运动角度,设定为 30°。rand
:静态随机数生成器,用于初始化流星的属性。
(2) 构造方法与初始化
Meteor
类的构造方法调用reset()
方法,对流星进行初始化。
length
取随机值,控制流星尾迹的长度。speed
设定在[10, 30]
范围内,保证不同流星速度各异。x, y
均设定为负值,确保流星初始时在屏幕外,从左上角斜向进入画面。color
设定为蓝色调(R 和 G 分量在[100, 255]
之间,B 分量固定为 255)。
(3) 运动逻辑
x
和y
坐标按照角度angle=30°
计算运动增量,实现流星的斜向运动。- 当
x
或y
超出窗口 (1200×800
),调用reset()
重新生成流星。
(4) 绘制流星
g2d.setColor(color);
设定流星颜色。g2d.setStroke(new BasicStroke(2));
设定线条粗细,使流星更清晰。drawLine(x, y, x2, y2);
画出流星,起点是(x, y)
,终点根据长度length
计算。
3. MeteorShower 类分析
MeteorShower
继承 JPanel
,用于管理所有流星并定期刷新动画。
(1) 成员变量
- 存储
Meteor
对象的动态数组,模拟多个流星。
(2) 构造方法
- 创建 100 颗流星,并存入
meteors
列表。 Timer
以 30ms 间隔触发事件,使流星不断移动并刷新画面。
(3) 绘制流星
setBackground(Color.BLACK);
设定黑色背景,模拟夜空。- 遍历
meteors
列表,调用draw(g);
依次绘制所有流星。
4. 主函数 (main 方法)
JFrame frame = new JFrame("流星雨");
创建主窗口。frame.add(panel);
添加MeteorShower
面板。frame.setSize(1200, 800);
设置窗口大小。frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
关闭窗口时退出程序。frame.setVisible(true);
显示窗口。
5. 运行原理总结
-
初始化流星:
MeteorShower
创建 100 颗Meteor
并存入列表。 -
定时刷新动画:
Timer
以 30ms 间隔触发move()
和repaint()
,模拟流星运动。 -
绘制流星:
paintComponent()
负责绘制背景和所有流星。 -
碰撞检测:当流星超出窗口,调用
reset()
重新生成,确保流星雨连续不断。
6. 总结
本代码通过 Java Swing
结合 Graphics2D
绘制流星雨动画,利用 Timer
控制流星运动,并通过 reset()
机制循环生成新流星,最终形成流畅的动态效果。
写在后面
我是一只有趣的兔子,感谢你的喜欢。