#动画 #aseprite #bevy #插件 #组件

bevy_mod_aseprite

用于在Bevy中使用Aseprite动画的插件

12个版本 (7个破坏性版本)

0.8.1 2024年7月30日
0.7.2 2024年4月3日
0.7.1 2024年3月31日
0.6.0 2023年12月29日
0.2.0 2022年12月26日

#159 in 游戏开发

Download history 3/week @ 2024-05-20 1/week @ 2024-06-03 38/week @ 2024-07-01 112/week @ 2024-07-15 5/week @ 2024-07-22 134/week @ 2024-07-29

每月下载量 285次
bevy_ldtk_asset 中使用

MIT/Apache

40KB
423

Bevy的Aseprite插件

latest doc

用于在 Aseprite 中使用 Bevy 的动画。

AsepriteBundle 由与 SpriteSheetBundle 相同的字段组成,但额外包含两个组件,Handle<Aseprite>AsepriteAnimation

示例

Aseprite Example

请参阅 examples/aseprite.rs 以获取完整示例,您可以使用以下命令运行它

cargo run --example aseprite

用法

基本用法如下

fn load_assets(asset_server: Res<AssetServer>, mut aseprite_handles: ResMut<AsepriteHandles>) {
    let player: Handle<Aseprite> = asset_server.load("player.ase");
    aseprite_handles.push(player);
}

fn setup(
    mut commands: Commands,
    aseprite_handles: Res<AsepriteHandles>,
    aseprites: Res<Assets<Aseprite>>,
) {
    let aseprite_handle = &aseprite_handles[0];
    let aseprite = aseprites.get(aseprite_handle).unwrap();
    let animation = AsepriteAnimation::new(aseprite.info(), "idle");

    commands
        .spawn(Player)
        .insert(AsepriteBundle {
            texture: aseprite.texture().clone_weak(),
            atlas: TextureAtlas {
                index: animation.current_frame(),
                layout: aseprite.layout().clone_weak(),
            },
            aseprite: aseprite_handle.clone_weak(),
            animation,
            ..default()
        });
}

#[derive(Resource, Deref, DerefMut, Default)]
struct AsepriteHandles(Vec<Handle<Aseprite>>);

组件 AsepriteAnimation 还公开了获取有关当前动画帧(在标签内或外)、其持续时间或剩余帧数的等信息的方法。这可以在动画结束时切换状态非常有用

fn transition_player(
    time: Res<Time>,
    player_q: Query<(&PlayerState, &Handle<Aseprite>, &AsepriteAnimation), With<Player>>,
    aseprites: Res<Assets<Aseprite>>,
    mut ev_player_changed: EventWriter<PlayerChanged>,
) {
    let (&player_state, handle, anim) = player_q.single();
    let aseprite = aseprites.get(handle).unwrap();
    match player_state {
        PlayerState::Attack => {
            let remaining_frames = anim.remaining_tag_frames(aseprite.info()).unwrap();
            let frame_finished = anim.frame_finished(time.delta());
            if remaining_frames == 0 && frame_finished {
                ev_player_changed.send(PlayerState::Stand.into());
            }
        }
        _ => (),
    }
}

Bevy兼容性

bevy bevy_mod_aseprite
0.14 0.8
0.13 0.7
0.12 0.6
0.11 0.5
0.10 0.4
0.9 0.2, 0.3
0.8 0.1

历史

此crate最初是 mdenchev/bevy_aseprite 的分支。

依赖关系

~36–73MB
~1.5M SLoC