diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8f7aa14 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "cSpell.words": [ + "despawn", + "Despawns", + "Perlin" + ] +} \ No newline at end of file diff --git a/crates/border-wars/assets/tiles/forest.png b/crates/border-wars/assets/tiles/forest.png new file mode 100644 index 0000000..b6c89ec Binary files /dev/null and b/crates/border-wars/assets/tiles/forest.png differ diff --git a/crates/border-wars/assets/tiles/grass.png b/crates/border-wars/assets/tiles/grass.png new file mode 100644 index 0000000..6ecf787 Binary files /dev/null and b/crates/border-wars/assets/tiles/grass.png differ diff --git a/crates/border-wars/assets/tiles/hill.png b/crates/border-wars/assets/tiles/hill.png new file mode 100644 index 0000000..1cb6354 Binary files /dev/null and b/crates/border-wars/assets/tiles/hill.png differ diff --git a/crates/border-wars/src/.main.rs.swp b/crates/border-wars/src/.main.rs.swp new file mode 100644 index 0000000..b1680bc Binary files /dev/null and b/crates/border-wars/src/.main.rs.swp differ diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index ef67c5e..0f01daa 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -1,11 +1,24 @@ //! The main entry point of the game. use bevy::prelude::*; +use border_wars::map::generation::{MapGenerationPlugin, StartMapGeneration}; +use border_wars::map::renderer::RendererPlugin; use border_wars::scenes::ScenesPlugin; +use border_wars::CurrentScene; fn main() { App::new() .add_plugins(DefaultPlugins) .add_plugins(ScenesPlugin) + .add_plugins(MapGenerationPlugin) + .add_plugins(RendererPlugin) + .add_systems(OnEnter(CurrentScene::Game), gen_map) .run(); } + +fn gen_map(mut event: EventWriter) { + event.send(StartMapGeneration { + seed: 5667, + radius: 5, + }) +} diff --git a/crates/border-wars/src/map/.renderer.rs.swp b/crates/border-wars/src/map/.renderer.rs.swp new file mode 100644 index 0000000..da1dbbe Binary files /dev/null and b/crates/border-wars/src/map/.renderer.rs.swp differ diff --git a/crates/border-wars/src/map/mod.rs b/crates/border-wars/src/map/mod.rs index 5265d18..73d0c06 100644 --- a/crates/border-wars/src/map/mod.rs +++ b/crates/border-wars/src/map/mod.rs @@ -2,6 +2,7 @@ pub mod generation; pub mod hex; +pub mod renderer; use bevy::prelude::*; diff --git a/crates/border-wars/src/map/renderer.rs b/crates/border-wars/src/map/renderer.rs new file mode 100644 index 0000000..ad38cce --- /dev/null +++ b/crates/border-wars/src/map/renderer.rs @@ -0,0 +1,56 @@ +//! All functions related to the rendering of the map. + +use bevy::prelude::*; + +use super::Tile; +use crate::map::TilePosition; + +/// A plugin to render the map. +pub struct RendererPlugin; + +impl Plugin for RendererPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Startup, setup_camera).add_systems( + Update, + render_map.run_if(in_state(crate::CurrentScene::Game)), + ); + } +} + +/// Sets up the camera. +fn setup_camera(mut commands: Commands) { + commands.spawn(Camera2dBundle::default()); +} + +impl Tile { + /// Returns the texture handle of the tile. + pub fn get_texture(&self, asset_server: &AssetServer) -> Handle { + match self { + Tile::Grass => asset_server.load("tiles/grass.png"), + Tile::Forest => asset_server.load("tiles/forest.png"), + Tile::Hill => asset_server.load("tiles/hill.png"), + } + } +} + +/// Renders the map. +fn render_map( + query: Query<(Entity, &TilePosition, &Tile), Changed>, + mut commands: Commands, + asset_server: Res, +) { + for (entity, position, tile) in query.iter() { + let pixel_position_ratio = position.to_pixel_coordinates(); + let pixel_position = (50. * pixel_position_ratio.x, pixel_position_ratio.y * 30.); + + commands.entity(entity).insert(SpriteBundle { + transform: Transform::from_translation(Vec3 { + x: pixel_position.0, + y: pixel_position.1, + z: 0., + }), + texture: tile.get_texture(&*asset_server), + ..default() + }); + } +}