-
Notifications
You must be signed in to change notification settings - Fork 7
/
crossfades.rs
79 lines (72 loc) · 2.34 KB
/
crossfades.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use bevy::prelude::*;
use bevy_spine::{
Crossfades, SkeletonController, SkeletonData, Spine, SpineBundle, SpinePlugin, SpineReadyEvent,
SpineSet, SpineSystem,
};
fn main() {
App::new()
.add_plugins((DefaultPlugins, SpinePlugin))
.add_systems(Startup, setup)
.add_systems(
Update,
(
on_spawn.in_set(SpineSet::OnReady),
crossfades.before(SpineSystem::UpdateAnimation),
),
)
.run();
}
fn setup(
asset_server: Res<AssetServer>,
mut commands: Commands,
mut skeletons: ResMut<Assets<SkeletonData>>,
) {
commands.spawn(Camera2dBundle::default());
let skeleton = SkeletonData::new_from_json(
asset_server.load("spineboy/export/spineboy-pro.json"),
asset_server.load("spineboy/export/spineboy-pma.atlas"),
);
let skeleton_handle = skeletons.add(skeleton);
let mut crossfades = Crossfades::new();
crossfades.add("idle", "walk", 0.5);
crossfades.add("walk", "idle", 0.5);
commands.spawn(SpineBundle {
skeleton: skeleton_handle.clone(),
crossfades,
transform: Transform::default()
.with_translation(Vec3::new(0., -200., 0.))
.with_scale(Vec3::ONE * 0.5),
..Default::default()
});
}
fn on_spawn(
mut spine_ready_event: EventReader<SpineReadyEvent>,
mut spine_query: Query<&mut Spine>,
) {
for event in spine_ready_event.read() {
if let Ok(mut spine) = spine_query.get_mut(event.entity) {
let Spine(SkeletonController {
animation_state, ..
}) = spine.as_mut();
let _ = animation_state.set_animation_by_name(0, "idle", true);
}
}
}
fn crossfades(mut spine_query: Query<&mut Spine>, time: Res<Time>) {
for mut spine in spine_query.iter_mut() {
let current_animation = spine
.animation_state
.track_at_index(0)
.unwrap()
.animation()
.name()
.to_owned();
if time.elapsed_seconds() % 2. > 1. {
if current_animation != "walk" {
let _ = spine.animation_state.set_animation_by_name(0, "walk", true);
}
} else if current_animation != "idle" {
let _ = spine.animation_state.set_animation_by_name(0, "idle", true);
}
}
}