use bevy::math::uvec2; use bevy::prelude::*; use crate::assets::AssetHandles; use crate::entities::lifecycle::GameEntity; use crate::entities::spawner::EntitySpawner; use crate::system::graphics::LAYER_TILE; use crate::world::adjacency::get_floor_sprite_offset; use crate::world::level_map::{GridPosition, Indexer, LevelMap, Tile, WORLD_TILE_SIZE}; pub fn spawn_new_world( mut commands: Commands, assets: Res<AssetHandles>, mut spawner: EntitySpawner, query: Query<(Entity, &LevelMap), Added<LevelMap>>, ) { for (entity, map) in &query { let mut cmds = commands.entity(entity); for (idx, layer) in map.layers.iter().enumerate() { cmds.with_children(|layer_cmds| { let indexer = Indexer::new(layer.width, layer.height); for (idx, tile) in layer.tiles.iter().enumerate() { if let Some(data) = tile { let (x, y) = indexer.reverse(idx); layer_cmds .spawn_bundle(SpriteSheetBundle { texture_atlas: assets.atlas("environs"), sprite: TextureAtlasSprite::new( layer.layer_type.transform_adjacency( data.tile_group, layer.get_tile_adjacency(x, y), ), ), transform: Transform::from_xyz( x as f32 * WORLD_TILE_SIZE, y as f32 * WORLD_TILE_SIZE, LAYER_TILE + (idx as f32 / 100.0), ), ..Default::default() }) .insert(GameEntity) .insert(Tile) .insert(GridPosition(uvec2(x as u32, y as u32))); } } }); } spawner.spawn_player(map.spawn); } }