背景
本动画创意来自之前在某个网站(记不清了)看到的效果,分别实现了 JavaScript 版本与 Java 版本,本文为 Java 版本。
使用 Java 制作简单的光斑动画。本意为练习线程池与多线程同步控制,结果实际做起来完全偏离了本意,基本没怎么用线程相关的内容,但是视觉效果不算太差。
内容
两个集合(ArrayList)、分别存放光斑和粒子对象,使用定时线程池定时执行主动画线程。
粒子与光斑本体碰撞会发光,并削减光斑半径,如果半径太小会自动增长
粒子受重力参数影响下落,与光斑碰撞会改变速度,越界会重置
光斑彼此碰撞时,碰撞的程度会影响彼此的加速度,半径越小受影响越大,且加速度有一定概率自己改变。
基本效果(调整参数可得到不同动画效果)
代码
注意,代码中使用了 switch 表达式(需要 JDK12+)
AlphaCircle.java
package normal.concurrent;
import java.awt.*;
import java.util.Random;
public class AlphaCircle extends Point {
private static Random random = new Random();
private static final float aIncrease = 0.1f;
private static final float maxSpeed = 5.0f;
private static final float radiusMaxThreshold = 50.0f;
private static final float radiusMinThreshold = 10.0f;
private float radius;
private float shadowSize;
private boolean inflate = false;
private float speedX, speedY, aX, aY; // 速度、加速度
private Color thisColor;
private Color shadowColor;
public static AlphaCircle randomCircle() {
return new AlphaCircle(random.nextInt(PainterHelper.WIDTH), random.nextInt(PainterHelper.HEIGHT),
random.nextFloat() * radiusMaxThreshold, new Color(random.nextInt(0x27FFFFFF), true), new Color(random.nextInt(0x03FFFFFF), true));
}
public static AlphaCircle fixColorCircle(Color mainColor, Color shadowColor) {
return new AlphaCircle(random.nextInt(PainterHelper.WIDTH), random.nextInt(PainterHelper.HEIGHT),
random.nextFloat() * radiusMaxThreshold, mainColor, shadowColor);
}
public AlphaCircle(float x, float y, float radius, Color rgbaColor, Color shadowColor) {
super(x, y);
this.radius = radius;
this.thisColor = rgbaColor;
this.shadowColor = shadowColor;
shadowSize = radius / 3;
}
private void draw(Graphics2D painter) {
painter.setColor(thisColor);
pa