-
Notifications
You must be signed in to change notification settings - Fork 3
/
progress.rs
129 lines (103 loc) · 3.3 KB
/
progress.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// This example shows how to control the progress of an animation.
#[path = "./common/mod.rs"]
pub mod common;
use bevy::prelude::*;
use bevy_spritesheet_animation::prelude::*;
fn main() {
App::new()
.add_plugins((
DefaultPlugins.set(ImagePlugin::default_nearest()),
SpritesheetAnimationPlugin,
))
.add_systems(Startup, setup)
.add_systems(Update, keyboard)
.run();
}
#[derive(Component)]
struct AllAnimations {
animation1_id: AnimationId,
animation2_id: AnimationId,
}
fn setup(
mut commands: Commands,
mut library: ResMut<AnimationLibrary>,
mut atlas_layouts: ResMut<Assets<TextureAtlasLayout>>,
assets: Res<AssetServer>,
) {
commands.spawn(Camera2dBundle::default());
// Create two animations
let spritesheet = Spritesheet::new(8, 8);
let mut create_animation = |frames| {
let clip = Clip::from_frames(frames).with_duration(AnimationDuration::PerFrame(2000));
let clip_id = library.register_clip(clip);
let animation = Animation::from_clip(clip_id);
library.register_animation(animation)
};
let animation1_id = create_animation(spritesheet.row(3));
let animation2_id = create_animation(spritesheet.horizontal_strip(0, 5, 5));
// Spawn an animated sprite
let texture = assets.load("character.png");
let layout = atlas_layouts.add(Spritesheet::new(8, 8).atlas_layout(96, 96));
commands.spawn((
SpriteBundle {
texture,
..default()
},
TextureAtlas {
layout,
..default()
},
SpritesheetAnimation::from_id(animation1_id),
// Store the two animation IDs in a component for convenience
AllAnimations {
animation1_id,
animation2_id,
},
));
// Help text
commands.spawn(TextBundle::from_section(
"P: play/pause\nR: reset animation\n0/1/2/3/4/5: switch to frame x\nS: switch animation",
TextStyle {
font_size: 30.0,
..default()
},
));
}
fn keyboard(
keyboard: Res<ButtonInput<KeyCode>>,
mut sprites: Query<(&mut SpritesheetAnimation, &AllAnimations)>,
) {
for (mut sprite, all_animations) in &mut sprites {
// Pause the current animation
if keyboard.just_pressed(KeyCode::KeyP) {
sprite.playing = !sprite.playing;
}
// Reset the current animation
if keyboard.just_pressed(KeyCode::KeyR) {
sprite.reset();
}
// Go to a specific frame of the current animation
let keys = [
KeyCode::Numpad0,
KeyCode::Numpad1,
KeyCode::Numpad2,
KeyCode::Numpad3,
KeyCode::Numpad4,
KeyCode::Numpad5,
];
for (frame, key) in keys.iter().enumerate() {
if keyboard.just_pressed(*key) {
sprite.progress.frame = frame;
}
}
// Switch to the other animation
if keyboard.just_pressed(KeyCode::KeyS) {
let next_animation = if sprite.animation_id == all_animations.animation1_id {
all_animations.animation2_id
} else {
all_animations.animation1_id
};
sprite.switch(next_animation);
}
}
}