Java 简易光斑动画

这篇博客介绍了如何使用Java创建一个简易的光斑动画。作者原本打算通过这个项目练习线程池和多线程同步控制,但最终实现的动画主要依赖于定时线程池和对象间的碰撞效果。动画包含光斑和粒子,粒子与光斑碰撞会改变状态,光斑之间碰撞则会影响彼此的加速度。文章提供了四个关键类的代码示例:AlphaCircle、ConcurrentDemo、PainterHelper和Particle。
摘要由CSDN通过智能技术生成

背景

本动画创意来自之前在某个网站(记不清了)看到的效果,分别实现了 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值