feat: Updated tilemap bundle

- Layout is now defined from bottom left corner
- Added rotation to lockpick bundle
- Added level TOML structures that match current level
This commit is contained in:
Alexey 2026-03-27 13:04:47 +03:00
commit 24153e476f
7 changed files with 225 additions and 72 deletions

View file

@ -23,11 +23,15 @@ pub struct Tilemap;
pub fn tilemap_bundle(
asset_server: &Res<AssetServer>,
size: UVec2,
tiles: Vec<(u16, UVec2)>,
tiles: Vec<(u16, URect)>,
) -> impl Bundle {
let mut size = uvec2(0, 0);
for tile in tiles.iter() {
size.x = size.x.max(tile.1.max.x + 1);
size.y = size.y.max(tile.1.max.y + 1);
}
let tile_data: Vec<Option<TileData>> = (0..size.element_product()).map(|xy| {
if let Some((id, _)) = tiles.iter().find(|(_, pos)| pos.x == xy % size.x && pos.y == xy / size.x) {
if let Some((id, _)) = tiles.iter().find(|(_, rect)| rect.contains(uvec2(xy % size.x, xy / size.x))) {
Some(TileData::from_tileset_index(*id))
} else { None }
}).collect();
@ -44,27 +48,26 @@ pub fn tilemap_bundle(
),
..default()
},
Transform::from_xyz(0., meters(0.5) * size.y as f32 - meters(3.), 0.),
Transform::from_xyz(
meters(0.5) * size.x as f32,
meters(0.5) * size.y as f32 - meters(1.),
0.,
),
TilemapChunkTileData(tile_data),
Children::spawn(SpawnIter(tiles.into_iter().map(move |(_, pos)| {(
// TODO: optimize colliders
Collider::cuboid(meters(0.5), meters(0.5)),
Children::spawn(SpawnIter(tiles.into_iter().map(move |(_, rect)| {
let mut rect = rect.as_rect();
rect.max = vec2(rect.max.x + 1., rect.max.y + 1.);
let (width, height) = (rect.width(), rect.height());
let offset = rect.center();
(
Collider::cuboid(meters(width * 0.5), meters(height * 0.5)),
Transform::from_xyz(
meters(0.5 + pos.x as f32 - (size.x as f32 * 0.5)),
meters(0.5 + pos.y as f32 - (size.y as f32 * 0.5)),
meters(offset.x - size.x as f32 * 0.5),
meters(offset.y - size.y as f32 * 0.5),
0.,
),
)})
)),
//Children::spawn(SpawnIter(colliders.into_iter()
// .map(move |(collider, pos)| {(
// collider.clone(),
// Transform::from_xyz(
// pos.x - meters(0.5) * size.x as f32,
// pos.y - meters(0.5) * size.y as f32,
// 0.
// ),
// )})
//)),
)}
))),
)
}