Adding a map creation plugin #57

Merged
CoCo_Sol merged 39 commits from map-generation into main 2024-02-21 20:10:03 +00:00
3 changed files with 25 additions and 13 deletions
Showing only changes of commit 915d5ba5a4 - Show all commits

View file

@ -5,6 +5,7 @@ use noise::{NoiseFn, Perlin};
use super::hex::*; use super::hex::*;
use super::Tile; use super::Tile;
use super::TilePosition;
/// A plugin to handle the map generation. /// A plugin to handle the map generation.
pub struct MapGenerationPlugin; pub struct MapGenerationPlugin;
@ -41,24 +42,25 @@ fn generate_map(
mut end_map_event: EventWriter<EndMapGeneration>, mut end_map_event: EventWriter<EndMapGeneration>,
mut commands: Commands, mut commands: Commands,
mut noise: Local<Option<Perlin>>, mut noise: Local<Option<Perlin>>,
mut map_iterator: Local<Option<HexSpiral<i32>>>, mut spiral: Local<Option<HexSpiral<i32>>>,
) { ) {
// Handle map generation events. // Handle map generation events.
for event in event.read() { for event in event.read() {
*noise = Some(Perlin::new(event.seed)); *noise = Some(Perlin::new(event.seed));
*map_iterator = Some(HexPosition(0, 0).spiral(event.radius as usize)); *spiral = Some(TilePosition::new(0,0).spiral(event.radius as usize));
} }
if let (Some(perlin), Some(spiral)) = (noise.as_ref(), map_iterator.as_mut()) { if let (None, None) = (noise.as_ref(), spiral.as_mut()) {
if let Some(position) = spiral.next() { return;
let pixel_position = position.to_pixel_coordinates((0.2, 0.2)); }
commands.spawn((get_type(pixel_position, perlin), position)); if let Some(position) = spiral.as_mut().unwrap().next() {
} else { let pixel_position = position.to_pixel_coordinates((0.2, 0.2));
end_map_event.send(EndMapGeneration); commands.spawn((get_type(pixel_position, &noise.unwrap()), position as TilePosition));
*noise = None; } else {
*map_iterator = None; end_map_event.send(EndMapGeneration);
} *noise = None;
} *spiral = None;
}
} }
CoCo_Sol marked this conversation as resolved
Review

This should be in the get_type function and the value shouldn't be hard coded

This should be in the get_type function and the value shouldn't be hard coded
/// Returns the type of the position with the given noise. /// Returns the type of the position with the given noise.

View file

@ -234,6 +234,11 @@ impl<T: Number> Iterator for HexSpiral<T> {
} }
impl<T: Number> HexPosition<T> { impl<T: Number> HexPosition<T> {
/// Creates a new [HexPosition].
pub fn new(x: T, y: T) -> Self {
Self(x, y)
}
/// Converts the current [HexPosition] into a pixel coordinate. /// Converts the current [HexPosition] into a pixel coordinate.
/// Input: The size of the hexagon in pixels (witdh, height). /// Input: The size of the hexagon in pixels (witdh, height).
/// ///

View file

@ -5,8 +5,13 @@ pub mod hex;
use bevy::prelude::*; use bevy::prelude::*;
use self::hex::*;
/// The position of a tile in a hexagonal map.
pub type TilePosition = HexPosition<i32>;
/// The tile of the map. /// The tile of the map.
#[derive(Component)] #[derive(Component, Debug)]
pub enum Tile { pub enum Tile {
/// The hill tile. /// The hill tile.
Hill, Hill,