lily/src/tilemap.rs

117 lines
2.9 KiB
Rust

use crate::setup::{MapState, SpriteHandles};
use bevy::{asset::LoadState, math::vec3, prelude::*, sprite::TextureAtlasBuilder};
use bevy_tilemap::prelude::*;
pub struct TilemapPlugin;
impl Plugin for TilemapPlugin {
fn build(&self, app: &mut AppBuilder) {
app.add_plugins(TilemapDefaultPlugins)
.add_startup_system(setup.system())
.add_system(load.system())
.add_system(build_world.system().after("egui_init"));
}
}
fn setup(mut sprite_handles: ResMut<SpriteHandles>, asset_server: Res<AssetServer>) {
sprite_handles.handles = asset_server.load_folder("textures").unwrap();
}
fn load(
mut commands: Commands,
mut sprite_handles: ResMut<SpriteHandles>,
mut texture_atlases: ResMut<Assets<TextureAtlas>>,
mut textures: ResMut<Assets<Texture>>,
windows: Res<Windows>,
asset_server: Res<AssetServer>,
) {
if sprite_handles.atlas_loaded {
return;
}
let window = windows.get_primary().unwrap();
let mut texture_atlas_builder = TextureAtlasBuilder::default();
if let LoadState::Loaded =
asset_server.get_group_load_state(sprite_handles.handles.iter().map(|handle| handle.id))
{
for handle in sprite_handles.handles.iter() {
let texture = textures.get(handle).unwrap();
texture_atlas_builder.add_texture(handle.clone_weak().typed::<Texture>(), &texture);
}
let texture_atlas = texture_atlas_builder.finish(&mut textures).unwrap();
let atlas_handle = texture_atlases.add(texture_atlas);
let tilemap = Tilemap::builder()
.auto_chunk()
.auto_spawn(1, 1)
.topology(GridTopology::Square)
.dimensions(768, 640)
.texture_dimensions(64, 64)
.chunk_dimensions(12, 10, 1)
.z_layers(3)
.texture_atlas(atlas_handle)
.finish()
.unwrap();
let tilemap_components = TilemapBundle {
tilemap,
visible: Visible {
is_visible: true,
is_transparent: true,
},
transform: Transform {
translation: vec3(
-(window.width() / 2.) + 220.,
(window.height() / 2.) - (64 * 10) as f32,
0.0,
),
..Default::default()
},
global_transform: Default::default(),
};
commands
.spawn()
.insert_bundle(OrthographicCameraBundle::new_2d());
commands
.spawn()
.insert_bundle(tilemap_components)
.insert(Timer::from_seconds(0.075, true));
sprite_handles.atlas_loaded = true;
}
}
fn build_world(
mut map_state: ResMut<MapState>,
texture_atlases: Res<Assets<TextureAtlas>>,
asset_server: Res<AssetServer>,
mut query: Query<&mut Tilemap>,
) {
if map_state.map_loaded {
return;
}
for mut map in query.iter_mut() {
let floor: Handle<Texture> = asset_server.get_handle("textures/debug-mark.png");
let texture_atlas = texture_atlases.get(map.texture_atlas()).unwrap();
let floor_index = texture_atlas.get_texture_index(&floor).unwrap();
let mut tiles = Vec::new();
for x in 0..12 {
for y in 0..10 {
tiles.push(Tile {
point: (x, y),
sprite_index: floor_index,
..Default::default()
});
}
}
map.insert_tiles(tiles).unwrap();
map_state.map_loaded = true;
}
}