From fa4798910d33c966d8b96c0010378c105a545889 Mon Sep 17 00:00:00 2001 From: GarandPLG Date: Tue, 18 Nov 2025 17:19:52 +0100 Subject: [PATCH] Add Bevy ECS Tilemap and initial map setup --- Cargo.lock | 11 ++++++++ Cargo.toml | 1 + assets/.gitkeep | 0 assets/base_field.png | Bin 0 -> 4171 bytes assets/dirt_field.png | Bin 0 -> 4244 bytes src/main.rs | 63 ++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 73 insertions(+), 2 deletions(-) delete mode 100644 assets/.gitkeep create mode 100644 assets/base_field.png create mode 100644 assets/dirt_field.png diff --git a/Cargo.lock b/Cargo.lock index 4f2cb35..5dabe05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -644,6 +644,16 @@ dependencies = [ "syn", ] +[[package]] +name = "bevy_ecs_tilemap" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7176ff40586face39666fab2c3692c62bd5de67987164e6d8b316bc19e27d7" +dependencies = [ + "bevy", + "log", +] + [[package]] name = "bevy_encase_derive" version = "0.17.2" @@ -4556,6 +4566,7 @@ name = "war-in-tunnels" version = "0.1.0" dependencies = [ "bevy", + "bevy_ecs_tilemap", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 38738e9..b746b02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2024" [dependencies] bevy = "0.17.2" +bevy_ecs_tilemap = "0.17.0" [profile.dev] opt-level = 1 diff --git a/assets/.gitkeep b/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/assets/base_field.png b/assets/base_field.png new file mode 100644 index 0000000000000000000000000000000000000000..c626e9f662a534191e2460bcaf3d96c21b857d97 GIT binary patch literal 4171 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 M9o;GA%Yrxj59)w1i~s-t literal 0 HcmV?d00001 diff --git a/assets/dirt_field.png b/assets/dirt_field.png new file mode 100644 index 0000000000000000000000000000000000000000..7b45977959f741a1f564fa03e651392fe4a8f82a GIT binary patch literal 4244 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 Ys`WCat}iTO!npv;*~6*GA$Y@o0g3QNIsgCw literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index e7a11a9..33151bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,62 @@ -fn main() { - println!("Hello, world!"); +use bevy::{prelude::*, window::WindowResolution}; +use bevy_ecs_tilemap::prelude::*; + +const MAP_SIZE: TilemapSize = TilemapSize { x: 50, y: 25 }; +const TILE_SIZE: TilemapTileSize = TilemapTileSize { x: 25.0, y: 25.0 }; + +fn startup(mut commands: Commands, asset_server: Res) { + commands.spawn(Camera2d); + + let dirt_texture_handle: Handle = asset_server.load("dirt_field.png"); + let base_texture_handle: Handle = asset_server.load("base_field.png"); + + let tilemap_entity = commands.spawn_empty().id(); + + let mut tile_storage = TileStorage::empty(MAP_SIZE); + + for x in 0..MAP_SIZE.x { + for y in 0..MAP_SIZE.y { + let tile_pos = TilePos { x, y }; + let tile_entity = commands + .spawn(TileBundle { + position: tile_pos, + tilemap_id: TilemapId(tilemap_entity), + ..Default::default() + }) + .id(); + tile_storage.set(&tile_pos, tile_entity); + } + } + + commands.entity(tilemap_entity).insert(TilemapBundle { + grid_size: TILE_SIZE.into(), + map_type: TilemapType::default(), + size: MAP_SIZE, + storage: tile_storage, + texture: TilemapTexture::Single(dirt_texture_handle), + tile_size: TILE_SIZE, + anchor: TilemapAnchor::Center, + ..Default::default() + }); +} + +fn main() { + App::new() + .add_plugins( + DefaultPlugins + .set(WindowPlugin { + primary_window: Some(Window { + title: String::from("War in Tunnels"), + resolution: WindowResolution::new(1250, 625) + .with_scale_factor_override(1.0), + ..Default::default() + }), + ..default() + }) + .set(ImagePlugin::default_nearest()), + ) + .add_plugins(TilemapPlugin) + .add_systems(Startup, startup) + // .add_systems(Update, helpers::camera::movement) + .run(); }