APEL

APEL

Apel 代表动画粒子引擎库,用于复杂的粒子动画,所有这些都无需线性代数专业背景。它为开发者提供了直观的接口和丰富的文档。

基础库

本项目已于 2026 年 6 月 20 日归档。原因请参见 GitHub README。

# 简要概述

Apel 代表 Animative Particle Engine Library(动画粒子引擎库)。它的目标是通过引入一个强大的动画引擎来大幅提升开发者的生产力,该引擎支持管理复杂的粒子动画。因此,该库旨在提供:

# 为什么使用 APEL? 简而言之,APEL 让你能够用极少的代码行完整地制作这些动画:



APEL 的核心优势具体包括:

  • 易用性: 该库将各个组件精简到最基础的形式。这提供了直观且易用的开发者接口,任何开发者都能上手。
  • 灵活性: 另一个目标是在不破坏其他目标因素的前提下,让该库尽可能灵活。该库允许组合复杂场景,而无需引入额外的语法糖。
  • 丰富的文档: 我们的团队致力于提供详细文档,清楚解释每项功能的工作原理。我们积极改进文档,可通过 Java 文档或 GitHub 中的 Markdown 文档阅读。
  • 高性能: 由于该库旨在用于创建复杂的粒子场景,因此它经过高度优化且对性能友好。

## 安装

开发者

本节面向将 APEL 作为库使用的开发者。

  1. 在你的 gradle.properties 文件中,添加这一行:
    apel_version=0.1.5+1.21.8
    
  2. 在 build.gradle 中,找到顶层的 repositories 块,如果你还没有从 Modrinth 安装其他依赖模组,请添加这些行:
    repositories {
     // ...
       maven {
           url = "https://api.modrinth.com/maven"
       }
     }
    
  3. 同样在 build.gradle 中,在 dependencies 块下添加依赖:
    dependencies {
       // ...
       modImplementation "maven.modrinth:apel:${project.apel_version}"
       // ...
    }
    
  4. 刷新 Gradle(在 IntelliJ IDEA 中,点击带有旋转子图标的 Gradle 图标)
  5. 尝试输入 Apel 并让 IDE 自动补全,或导入 net.mcbrincie.apel.Apel。如果所有步骤都已完成,一切应该按预期工作。

玩家

通过你常用的方式下载该模组,并将其放入你的 mods 文件夹。

## 使用 APEL 的示例 对于一个常规粒子多边形,它从一点沿直线移动到另一点,围绕 Y 轴旋转,并通过在 3 边到 30 边之间动画来实现循环,代码如下所示(这不是最直接的入门示例,但展示了各种可能性):

AtomicBoolean reverse = new AtomicBoolean(false);

ParticlePolygon polygon = ParticlePolygon.builder()
  .particleEffect(ParticleTypes.END_ROD)
  .sides(3)
  .scale(3.0f)
  .amount(100)
  .beforeDraw((data, obj) -> {
    if (data.getCurrentStep() <= 15) {
      return;
    }
    boolean isStepZero = data.getCurrentStep() % 15 == 0;
    int sides = ApelUtils.getValueFromEasingCurve(obj.getSides());
    if (isStepZero && !reverse.get()) {
      obj.setSides(sides + 1);
      if (sides >= 30) {
        reverse.set(true);
      }
    } else if (isStepZero && reverse.get()) {
        obj.setSides(sides - 1);
        if (sides == 4) {
          reverse.set(false);
        }
    }
    Vector3f newRot = ApelUtils.getValueFromEasingCurve(obj.getRotation()).add(0, 0.002f, 0);
    obj.setRotation(newRot);
})
  .build();
        
LinearAnimator linearAnimator = LinearAnimator.builder()
  .endpoint(new Vector3f())
  .endpoint(new Vector3f(10, 0, 0))
  .particleObject(polygon)
  .delay(1)
  .stepsForAllSegments(1000)
  .build();

ApelServerRenderer renderer = ApelServerRenderer.client((ServerWorld) world);
linearAnimator.beginAnimation(renderer);

我们定义了粒子对象(ParticlePolygon),包括要使用的粒子效果、多边形的边数、多边形的大小以及多边形上使用的粒子数量。

之后,我们使用该库在渲染每一帧之前修改对象的能力。这是通过一个 lambda 函数实现的,该函数接收一些上下文和要渲染的对象。此示例通过检查动画当前所处的步骤来修改多边形的边数,并据此确定多边形应具有的边数。它还展示了如何递增旋转(以每个轴的欧拉角表示),在本例中是每个 tick 围绕 Y 轴轻微旋转。

注意:我们使用 ApelUtils.getValueFromEasingCurve 提取旋转值和边数,在我们的情况中我们知道这不是空值,因此可以正常工作。

然后我们创建一个线性路径动画器,并向它提供帧之间的 tick 延迟、线的起始位置、线的结束位置、要使用的粒子对象以及动画的渲染步数。

最后,我们播放线性路径动画器,并向它提供用于服务端渲染的渲染器实例。

注意

根据开发者是否选择使用 Apel 的客户端渲染器,该模组可能需要安装在客户端。客户端渲染器比服务端渲染器更能优化粒子,但要求玩家安装客户端模组。如果他们不选择客户端渲染器,则无需客户端模组。

## 链接 / 社交媒体