#sprite-sheet #animation #aseprite #game-engine #component #bevy-plugin #json

bevy_asepritesheet

允许在Bevy游戏引擎中使用导出的动画aseprite精灵图集

9个版本 (4个破坏性)

0.6.0 2024年2月23日
0.5.2 2023年12月13日
0.4.2 2023年12月11日
0.3.0 2023年11月7日
0.2.0 2023年10月26日

#380 in 游戏开发

MIT许可协议

1MB
875

Bevy Asepritesheet

Bevy Asepritesheet是Bevy游戏引擎的资产加载器和解析器。Bevy Asepritesheet处理由Bevy游戏引擎导出的json精灵图集文件。它还包括构建和管理游戏中的动画精灵实体的组件和系统。

Bevy Asepritesheet能够解析类似于这样的精灵图集,将其转换为基于aseprite json数据的独立动画。

Spritesheet Animation

重要!- Json数据导出自Aseprite时,必须设置为"Array"。

array_mode
如果设置为"Hash",则不会工作!

功能

  • 资产加载器 - 资产加载器可以指定所需的任何文件扩展名
  • 精灵动画器 - 库中包含精灵动画器组件,用于在游戏世界中生成具有动画的实体
  • 插件 - 库包含一个Bevy插件,可以将资产加载器添加到Bevy应用程序中,并自动注册动画事件系统,以及设置自动动画精灵组件
  • 动画事件 - 动画发送动画事件,每当动画结束时,都会发送事件,包含实体和动画的信息,因此您可以根据需要对其进行监听和处理
  • 动画结束动作 - 动画可以循环、暂停、停止或过渡到另一个动画,所有这些都可以通过库配置

Aseprite功能支持

Bevy Ase spritesheet支持Aseprite导出的几乎所有功能,以下是已导出并是否在Bevy Ase spritesheet中支持的功能列表

✅ - 完全支持并实现
❌ - 不支持

Aseprite功能

  • 帧 ✅ - 每个精灵图集中的帧作为矩形解析,并由库处理
  • 帧裁剪 ✅ - Aseprite可以裁剪帧矩形,以避免在帧之间出现不必要的间隔,库会处理每个帧的裁剪并相应地调整锚点,以避免动画抖动
  • 帧持续时间 ✅ - Aseprite中的每个帧都有特定的显示时间,库会包含这些数据,并在游戏运行时反映出来
  • 帧标签 ✅ - 帧标签是精灵中帧的组合,可以拥有一个“标签”,这个库将标签解释为动画,因此如果您有一个名为“running”的包含10个帧的FrameTag,这个库将从这个标签生成一个“running”动画
  • 帧标签范围 ✅ - 在游戏中,指定为帧标签的帧将包含在动画中
  • 帧标签方向 ❌ - 在Aseprite中,您可以指定帧标签是正向播放还是反向播放,我觉得这没有太大意义,所以不会实现这个功能,如果您需要反转动画,您可以始终反转帧

兼容性

bevy_asepritesheet bevy aseprite
0.6.x 0.13 1.3.4
0.5.x 0.12 1.3.2
0.4.x 0.12 1.3.2
0.3.x 0.12 1.2.40
0.2.x 0.11 1.2.40

使用示例

首先,您需要在Cargo.toml中添加依赖项

[dependencies]
bevy_aseprite = "0.5"

然后,您需要将插件添加到您的bevy应用程序中

use bevy::prelude::*;
use bevy_asepritesheet::prelude::*;
fn main() {
    App::new()
        .add_plugins(( DefaultPlugins.set(ImagePlugin::default_nearest()),
            AsepritesheetPlugin::new(&["sprite.json"]),
        ))
        .add_systems(Startup, setup)
        .run();
}

然后,您只需加载精灵表,并使用句柄创建一个AnimatedSpriteBundle来开始动画精灵,就是这样!

fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
    // spawn the camera so we can see the sprite
    commands.spawn(Camera2dBundle::default());
    // load the spritesheet and get it's handle
    let sheet_handle = load_spritesheet(
        &mut commands,
        &asset_server,
        "witch.sprite.json",
        bevy::sprite::Anchor::Center,
    );
    // spawn the animated sprite
    commands.spawn(AnimatedSpriteBundle {
        animator: SpriteAnimator::from_anim(AnimHandle::from_index(1)),
        spritesheet: sheet_handle,
        ..Default::default()
    });
}

AnimatedSpriteBundle实体将在资产加载完成之前保持不可见

运行示例

要运行示例

cargo run --example character

要查看完整的示例,请参阅examples/character.rs

资产信用

我使用的资产是Legnops制作的免费资产的修改版本
https://legnops.itch.io/red-hood-character

更新日志

0.6.0

  • ✅ 支持 Bevy 0.13
  • ✅ 添加了 Spritesheet 监听器以添加相关句柄
  • ✅ 可指定动画调度程序,或指定无动画
  • ✅ 更新示例

0.5.1

  • ✅ 更新示例
  • ✅ 设置无效动画现在会生成警告并将cur_anim重置为None
  • ✅ 添加当 Spritesheet 加载完成时的事件

0.5.0

  • ✅ 更新示例
  • ✅ 通用重构
  • ✅ 资源以处理动画逻辑
  • ✅ utility 函数 load_spritesheet 以自动加载相关资产
  • ✅ 重构从动画器引用精灵表的方式,现在使用句柄
  • ✅ get_anim_handle 现在不那么严格(但返回的句柄可能无效)
  • ✅ set_anim 现在不那么严格

0.4.2

  • ✅ 小型错误修复

0.4.1

  • ✅ 修复导致翻转精灵锚点错位的错误
  • ✅ 实现AnimHandle的默认值
  • ✅ 添加is_cur_anim()到SpriteAnimator,以便轻松比较当前动画
  • ✅ 添加restart_anim()来重新开始精灵动画器的当前动画

0.4.0

  • ✅ 更新示例
  • ✅ 修复导致难以使用Spritesheet::from_data()的错误
  • ✅ 为AnimatedSpriteBundle实现默认值
  • ✅ 为SpriteAnimator实现默认值
  • ✅ 使SpriteAnimator在初始化时不需要加载表
  • ✅ 将Sheet类型重命名为Spritesheet
  • ✅ 通用代码重构,以更好地符合 Rust 的惯用模式

0.3.0

  • ✅ 适配资产管理模块以与 bevy 0.12 一起使用

依赖项

~18–46MB
~729K SLoC