use bevy::{ asset::{HandleId, LoadState}, prelude::*, sprite::TextureAtlasBuilder, }; fn main() { App::build() .init_resource::() .init_resource::() .add_default_plugins() .add_startup_system(setup.system()) .add_system(load_atlas.system()) .run(); } #[derive(Default)] pub struct RpgSpriteHandles { handles: Vec, } fn setup( mut commands: Commands, mut rpg_sprite_handles: ResMut, asset_server: Res, ) { rpg_sprite_handles.handles = asset_server .load_asset_folder("assets/textures/rpg") .unwrap(); commands.spawn(Camera2dComponents::default()); } #[derive(Default)] struct State { atlas_loaded: bool, } fn load_atlas( mut commands: Commands, mut state: ResMut, rpg_sprite_handles: Res, asset_server: Res, mut texture_atlases: ResMut>, mut textures: ResMut>, mut materials: ResMut>, ) { if state.atlas_loaded { return; } let mut texture_atlas_builder = TextureAtlasBuilder::default(); if let Some(LoadState::Loaded(_)) = asset_server.get_group_load_state(&rpg_sprite_handles.handles) { for texture_id in rpg_sprite_handles.handles.iter() { let handle = Handle::from_id(*texture_id); let texture = textures.get(&handle).unwrap(); texture_atlas_builder.add_texture(handle, &texture); } let texture_atlas = texture_atlas_builder.finish(&mut textures).unwrap(); let texture_atlas_texture = texture_atlas.texture; let vendor_handle = asset_server .get_handle("assets/textures/rpg/chars/vendor/generic-rpg-vendor.png") .unwrap(); let vendor_index = texture_atlas.get_texture_index(vendor_handle).unwrap(); let atlas_handle = texture_atlases.add(texture_atlas); commands // draw a sprite from the atlas .spawn(SpriteSheetComponents { scale: Scale(4.0), translation: Translation(Vec3::new(150.0, 0.0, 0.0)), sprite: TextureAtlasSprite::new(vendor_index as u32), texture_atlas: atlas_handle, ..Default::default() }) // draw the atlas itself .spawn(SpriteComponents { material: materials.add(texture_atlas_texture.into()), translation: Vec3::new(-300.0, 0., 0.0).into(), ..Default::default() }); state.atlas_loaded = true; } }