• 论坛

导航

  • 主页
  • 样式指南
  • 入门
    • 概述
    • Mod的结构
    • Forge更新检查器
    • 依赖管理
    • 调试分析器
  • 概念
    • Sides
    • 资源
    • 注册表
    • Jar签名
    • 国际化和本地化
  • 方块
    • 概述
    • 介绍方块状态
    • 方块互动
  • 动画 API
    • 概述
    • 骨骼
    • 动画状态机
    • 使用API
      • 方块
      • 物品
      • 实体
  • TileEntity
    • 概述
    • 特殊渲染器
  • 物品
    • 主页
    • 战利品表
  • 模型
    • 模型概述
    • 模型文件
    • 方块状态
      • 方块状态JSON概述
      • Forge方块状态JSON
    • 绑定模型到方块和物品
    • 彩色纹理
    • 物品属性概述
    • 高级模型(未翻译)
      • 高级模型介绍
      • IModel
      • IModelState and IModelPart
      • IBakedModel
      • Extended Blockstates
      • Perspective
      • ItemOverrideList
      • ICustomModelLoader
  • 渲染
    • TileEntityItemStackRenderer
  • 事件
    • 基本用法
  • 网络
    • 主页
    • 概述
    • SimpleImpl
    • 实体
  • 数据储存
    • 能力系统
    • World Saved Data
    • 拓展实体属性
    • Config注解
  • 工具
    • 合成
    • 矿物词典
    • 权限API
  • 效果
    • 音效
  • 惯例
    • 版本命名
    • 文件位置
    • 加载阶段
  • 参与Forge开发
    • 入门
    • PR指南

使用 API

根据您希望使用API制作动画不同,代码端实现有点不同。 有关ASM API本身(用于控制动画)的文档可在ASM页面上找到,因为它与您动画的内容无关。

方块

方块的动画是用AnimationTESR完成的,它是一个FastTESR。 因此,必须为您的块设置TileEntity。 你的TileEntity必须提供ANIMATION_CAPABILITY,它通过你的ASM调用它的.cast方法来接收。 如果你没有在方块的块状态中提供StaticProperty,那么你的方块也必须在ENTITYBLOCK_ANIMATED渲染层中渲染。

StaticProperty是一个属性,你可以通过在createBlockState()里面的方块的属性列表中添加Properties.StaticProperty来添加到方块的块状态。 渲染方块时,AnimationTESR检查属性的值是否为真; 如果为真,则块渲染继续正常进行。 否则,AnimationTESR动画分配给方块状态json中的static=false变体的方块模型。 模型所有的静态部分应该静态渲染的,因为这是它的目的。

handleEvents()回调位于AnimationTESR 中,因此在注册TileEntity时必须重载。

这是一个注册TESR的示例:

ClientRegistry.bindTileEntitySpecialRenderer(Chest.class, new AnimationTESR<Chest>()
{
    @Override
    public void handleEvents(Chest chest, float time, Iterable<Event> pastEvents)
    {
        chest.handleEvents(time, pastEvents);
    }
}); 

在这个例子中,我们在注册TESR时重写了handleEvents()回调,因为实现很简单,但你可以轻松地继承AnimationTESR以实现相同的效果。 方块的handleEvents()回调有两个参数:正在渲染的tile实体和一个可迭代的事件。 对chest.handleEvents()的调用调用位于虚构的ChestTileEntity中的方法,因为在handleEvents()方法中无法访问ASM。

物品

物品的动画完全使用功能系统完成。 您的物品必须通过ICapabilityProvider提供ANIMATION_CAPABILITY。 你可以创建这个功能的一个实例,它使用你的ASM的.cast方法,它通常存储在ICapabilityProvider对象本身。 下面是一个例子:

private static class ItemAnimationHolder implements ICapabilityProvider
{
    private final VariableValue cycleLength = new VariableValue(4);

    private final IAnimationStateMachine asm = proxy.load(new ResourceLocation(MODID.toLowerCase(), "asms/block/engine.json"), ImmutableMap.<String, ITimeValue>of(
        "cycle_length", cycleLength
    ));

    @Override
    public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing facing)
    {
        return capability == CapabilityAnimation.ANIMATION_CAPABILITY;
    }

    @Override
    @Nullable
    public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing)
    {
        if(capability == CapabilityAnimation.ANIMATION_CAPABILITY)
        {
            return CapabilityAnimation.ANIMATION_CAPABILITY.cast(asm);
        }
        return null;
    }
}

无法在当前实现中的物品上接收事件。

实体

为了使用动画API为实体设置动画,实体的渲染器必须将AnimationModelBase作为其模型。 该模型的构造函数采用两个参数,即实际模型的位置(如JSON或B3D文件的路径,而不是方块状态引用)和VertexLighter。 可以使用new VertexLighterSmoothAo(Minecraft.getMinecraft().getBlockColors())创建VertexLighter对象。 实体还必须提供ANIMATION_CAPABILITY,它可以通过传递ASM以.cast方法创建。

handleEvents()回调位于AnimationModelBase类中,如果你想使用该事件,你必须继承AnimationModelBase类。 回调有三个参数:正在渲染的实体,当前时间(tick),以及已发生事件的可迭代对象。

创建渲染器的示例如下所示:

ResourceLocation location = new ModelResourceLocation(new ResourceLocation(MODID, blockName), "entity");
return new RenderLiving<EntityChest>(manager, new net.minecraftforge.client.model.animation.AnimationModelBase<EntityChest>(location, new VertexLighterSmoothAo(Minecraft.getMinecraft().getBlockColors()))
{
    @Override
    public void handleEvents(EntityChest chest, float time, Iterable<Event> pastEvents)
    {
        chest.handleEvents(time, pastEvents);
    }
}, 0.5f) {

// ... getEntityTexture() ...

};
基于 MkDocs 使用自定义主题构建. 托管于 Read the Docs.
启用夜间模式