handlers.rs 1.50 KiB
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);
}
}