ui_texture_atlas/
ui_texture_atlas.rs1use bevy::{color::palettes::css::*, prelude::*};
4
5fn main() {
6 App::new()
7 .add_plugins(DefaultPlugins.set(
8 ImagePlugin::default_nearest(),
12 ))
13 .add_systems(Startup, setup)
14 .add_systems(Update, increment_atlas_index)
15 .run();
16}
17
18fn setup(
19 mut commands: Commands,
20 asset_server: Res<AssetServer>,
21 mut texture_atlases: ResMut<Assets<TextureAtlasLayout>>,
22) {
23 commands.spawn(Camera2d);
25
26 let text_font = TextFont::default();
27
28 let texture_handle = asset_server.load("textures/rpg/chars/gabe/gabe-idle-run.png");
29 let texture_atlas = TextureAtlasLayout::from_grid(UVec2::splat(24), 7, 1, None, None);
30 let texture_atlas_handle = texture_atlases.add(texture_atlas);
31
32 commands
34 .spawn(Node {
35 width: percent(100),
36 height: percent(100),
37 flex_direction: FlexDirection::Column,
38 justify_content: JustifyContent::Center,
39 align_items: AlignItems::Center,
40 row_gap: px(text_font.font_size * 2.),
41 ..default()
42 })
43 .with_children(|parent| {
44 parent.spawn((
45 ImageNode::from_atlas_image(
46 texture_handle,
47 TextureAtlas::from(texture_atlas_handle),
48 ),
49 Node {
50 width: px(256),
51 height: px(256),
52 ..default()
53 },
54 BackgroundColor(ANTIQUE_WHITE.into()),
55 Outline::new(px(8), Val::ZERO, CRIMSON.into()),
56 ));
57 parent
58 .spawn((Text::new("press "), text_font.clone()))
59 .with_child((
60 TextSpan::new("space"),
61 TextColor(YELLOW.into()),
62 text_font.clone(),
63 ))
64 .with_child((TextSpan::new(" to advance frames"), text_font));
65 });
66}
67
68fn increment_atlas_index(
69 mut image_nodes: Query<&mut ImageNode>,
70 keyboard: Res<ButtonInput<KeyCode>>,
71) {
72 if keyboard.just_pressed(KeyCode::Space) {
73 for mut image_node in &mut image_nodes {
74 if let Some(atlas) = &mut image_node.texture_atlas {
75 atlas.index = (atlas.index + 1) % 6;
76 }
77 }
78 }
79}