-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathimmediate_spawn.rs
84 lines (76 loc) · 2.42 KB
/
immediate_spawn.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
80
81
82
83
84
//! Demonstrates how to spawn a [`SpineBundle`] and use it in one frame.
use bevy::{app::AppExit, core::FrameCount, prelude::*};
use bevy_spine::{
SkeletonData, Spine, SpineBundle, SpinePlugin, SpineReadyEvent, SpineSet, SpineSystem,
};
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
pub enum ExampleSet {
Spawn,
}
fn main() {
App::new()
.add_plugins((DefaultPlugins, SpinePlugin))
.init_resource::<DemoData>()
.add_systems(Startup, setup)
.add_systems(
Update,
(
spawn.in_set(ExampleSet::Spawn).after(SpineSystem::Load),
on_spawn.in_set(SpineSet::OnReady),
apply_deferred
.after(ExampleSet::Spawn)
.before(SpineSystem::Spawn),
),
)
.run();
}
#[derive(Default, Resource)]
struct DemoData {
skeleton_handle: Handle<SkeletonData>,
spawned: bool,
}
fn setup(
asset_server: Res<AssetServer>,
mut commands: Commands,
mut skeletons: ResMut<Assets<SkeletonData>>,
mut demo_data: ResMut<DemoData>,
) {
commands.spawn(Camera2d);
let skeleton = SkeletonData::new_from_json(
asset_server.load("spineboy/export/spineboy-pro.json"),
asset_server.load("spineboy/export/spineboy-pma.atlas"),
);
demo_data.skeleton_handle = skeletons.add(skeleton);
}
fn spawn(
skeletons: Res<Assets<SkeletonData>>,
mut demo_data: ResMut<DemoData>,
mut commands: Commands,
frame_count: Res<FrameCount>,
) {
if !demo_data.spawned {
if let Some(skeleton) = skeletons.get(&demo_data.skeleton_handle) {
if skeleton.is_loaded() {
commands.spawn(SpineBundle {
skeleton: demo_data.skeleton_handle.clone().into(),
transform: Transform::from_xyz(0., -200., 0.).with_scale(Vec3::ONE * 0.5),
..Default::default()
});
demo_data.spawned = true;
println!("spawned on frame: {}", frame_count.0);
}
}
}
}
fn on_spawn(
mut spine_ready_event: EventReader<SpineReadyEvent>,
mut app_exit: EventWriter<AppExit>,
spine_query: Query<&Spine>,
frame_count: Res<FrameCount>,
) {
for event in spine_ready_event.read() {
assert!(spine_query.contains(event.entity));
println!("ready on frame: {}", frame_count.0);
app_exit.send_default();
}
}