117 lines
2.9 KiB
Rust
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;
|
|
}
|
|
}
|