//! This example illustrates how to use `TextureAtlases` within ui use bevy::{color::palettes::css::*, prelude::*}; fn main() { App::new() .add_plugins(DefaultPlugins.set( // This sets image filtering to nearest // This is done to prevent textures with low resolution (e.g. pixel art) from being blurred // by linear filtering. ImagePlugin::default_nearest(), )) .add_systems(Startup, setup) .add_systems(Update, increment_atlas_index) .run(); } fn setup( mut commands: Commands, asset_server: Res, mut texture_atlases: ResMut>, ) { // Camera commands.spawn(Camera2d); let font_size: f32 = 20.; let text_font = TextFont::from_font_size(20.); let texture_handle = asset_server.load("textures/rpg/chars/gabe/gabe-idle-run.png"); let texture_atlas = TextureAtlasLayout::from_grid(UVec2::splat(24), 7, 1, None, None); let texture_atlas_handle = texture_atlases.add(texture_atlas); // root node commands .spawn(Node { width: percent(100), height: percent(100), flex_direction: FlexDirection::Column, justify_content: JustifyContent::Center, align_items: AlignItems::Center, row_gap: px(font_size * 2.), ..default() }) .with_children(|parent| { parent.spawn(( ImageNode::from_atlas_image( texture_handle, TextureAtlas::from(texture_atlas_handle), ), Node { width: px(256), height: px(256), ..default() }, BackgroundColor(ANTIQUE_WHITE.into()), Outline::new(px(8), Val::ZERO, CRIMSON.into()), )); parent .spawn((Text::new("press "), text_font.clone())) .with_child(( TextSpan::new("space"), TextColor(YELLOW.into()), text_font.clone(), )) .with_child((TextSpan::new(" to advance frames"), text_font)); }); } fn increment_atlas_index( mut image_nodes: Query<&mut ImageNode>, keyboard: Res>, ) { if keyboard.just_pressed(KeyCode::Space) { for mut image_node in &mut image_nodes { if let Some(atlas) = &mut image_node.texture_atlas { atlas.index = (atlas.index + 1) % 6; } } } }