tilemap part 1

This commit is contained in:
StephenAdamson
2024-12-13 18:29:27 +00:00
parent 01e1349ea1
commit 70cce2c5e9
3 changed files with 102 additions and 34 deletions
+26 -28
View File
@@ -1,16 +1,21 @@
use crate::citizen::Citizen; use crate::citizen::Citizen;
use crate::item::{Item, ItemBundle}; use crate::item::{Item, ItemBundle};
use crate::tile::{FloorTile, Tile, TileState}; use crate::tiles::TilePrefab;
use bevy::prelude::*; use bevy::prelude::*;
use rand::prelude::*; use rand::prelude::*;
pub const PIXEL_RATIO: f32 = 4.0; pub const PIXEL_RATIO: f32 = 4.0;
pub fn setup_level(mut commands: Commands, asset_server: Res<AssetServer>) { #[derive(Resource)]
setup_tilemap(&mut commands, &asset_server); pub struct TileMap {
pub tiles: Vec<Vec<Vec<Entity>>>,
}
pub fn setup_level(mut commands: Commands, asset_server: Res<AssetServer>, mut tilemap: ResMut<TileMap>) {
setup_tilemap(&mut commands, &asset_server, tilemap);
for x in 0..25 { for x in 0..25 {
for y in 0..25 { for y in 0..250 {
if random::<f32>() < 0.1 { if random::<f32>() < 0.1 {
commands.spawn(Citizen::new( commands.spawn(Citizen::new(
&asset_server, &asset_server,
@@ -21,9 +26,11 @@ pub fn setup_level(mut commands: Commands, asset_server: Res<AssetServer>) {
} }
} }
fn setup_tilemap(commands: &mut Commands, asset_server: &Res<AssetServer>) { fn setup_tilemap(commands: &mut Commands, asset_server: &Res<AssetServer>, mut tilemap: ResMut<TileMap>) {
for x in 0..25 { for x in 0..25 {
let mut row:Vec<Vec<Entity>> = Vec::new();
for y in 0..25 { for y in 0..25 {
let mut column:Vec<Entity> = Vec::new();
for z in 0..4 { for z in 0..4 {
let position = Vec3::new( let position = Vec3::new(
x as f32 * 16. * PIXEL_RATIO, x as f32 * 16. * PIXEL_RATIO,
@@ -32,15 +39,21 @@ fn setup_tilemap(commands: &mut Commands, asset_server: &Res<AssetServer>) {
); );
let mut noitem: bool = false; let mut noitem: bool = false;
let texture: Handle<Image>; let tile_entity: Entity;
if random::<f32>() < 0.4 { if random::<f32>() < 0.4 {
texture = asset_server.load("grass.png"); tile_entity = commands
.spawn(TilePrefab::grass(position, asset_server))
.id();
} else if random::<f32>() < 0.2 { } else if random::<f32>() < 0.2 {
texture = asset_server.load("dirt.png"); tile_entity = commands
.spawn(TilePrefab::dirt(position, asset_server))
.id();
} else if random::<f32>() < 0.1 { } else if random::<f32>() < 0.1 {
texture = asset_server.load("rock.png"); tile_entity = commands
.spawn(TilePrefab::rock(position, asset_server))
.id();
} else { } else {
texture = asset_server.load("sky.png"); tile_entity = commands.spawn(TilePrefab::air(position, asset_server)).id();
noitem = true; noitem = true;
}; };
@@ -82,30 +95,15 @@ fn setup_tilemap(commands: &mut Commands, asset_server: &Res<AssetServer>) {
} }
} }
let tile_entity = commands
.spawn((
Transform::from_translation(position).with_scale(Vec3::splat(PIXEL_RATIO)),
Sprite {
image: texture,
..Default::default()
},
FloorTile {
walkable: random::<f32>() < 0.7,
astar_weight: random::<u8>() % 10 + 1,
},
Tile { position: position },
TileState {
timer: Timer::from_seconds(1., TimerMode::Repeating),
},
))
.id();
let mut child_entities = Vec::new(); let mut child_entities = Vec::new();
for item in items { for item in items {
child_entities.push(commands.spawn(item).id()); child_entities.push(commands.spawn(item).id());
} }
commands.entity(tile_entity).add_children(&child_entities); commands.entity(tile_entity).add_children(&child_entities);
column.push(tile_entity);
} }
row.push(column);
} }
tilemap.tiles.push(row);
} }
} }
+1
View File
@@ -5,6 +5,7 @@ mod citizen;
mod camera; mod camera;
mod item; mod item;
mod tile; mod tile;
mod tiles;
fn main() { fn main() {
App::new() App::new()
+75 -6
View File
@@ -1,9 +1,78 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::game::PIXEL_RATIO;
pub enum Tiles{ #[derive(Component)]
air, #[require(Sprite)]
grass, pub struct Tile {
dirt, pub position: Vec3,
rock,
} }
// BUNDLES!!
#[derive(Component)]
pub struct TileState {
pub timer: Timer,
}
#[derive(Bundle)]
pub struct TilePrefab {
transform: Transform,
sprite: Sprite,
tile: Tile,
tile_state: TileState,
}
impl TilePrefab {
pub fn dirt(position: Vec3, asset_server: &Res<AssetServer>) -> Self {
TilePrefab {
transform: Transform::from_translation(position).with_scale(Vec3::splat(PIXEL_RATIO)),
sprite: Sprite {
image: asset_server.load("dirt.png"),
..Default::default()
},
tile: Tile { position },
tile_state: TileState {
timer: Timer::from_seconds(1.0, TimerMode::Repeating),
},
}
}
pub fn grass(position: Vec3, asset_server: &Res<AssetServer>) -> Self {
TilePrefab {
transform: Transform::from_translation(position).with_scale(Vec3::splat(PIXEL_RATIO)),
sprite: Sprite {
image: asset_server.load("grass.png"),
..Default::default()
},
tile: Tile { position },
tile_state: TileState {
timer: Timer::from_seconds(1.0, TimerMode::Repeating),
},
}
}
pub fn rock(position: Vec3, asset_server: &Res<AssetServer>) -> Self {
TilePrefab {
transform: Transform::from_translation(position).with_scale(Vec3::splat(PIXEL_RATIO)),
sprite: Sprite {
image: asset_server.load("rock.png"),
..Default::default()
},
tile: Tile { position },
tile_state: TileState {
timer: Timer::from_seconds(1.0, TimerMode::Repeating),
},
}
}
pub fn air(position: Vec3, asset_server: &Res<AssetServer>) -> Self {
TilePrefab {
transform: Transform::from_translation(position).with_scale(Vec3::splat(PIXEL_RATIO)),
sprite: Sprite {
image: asset_server.load("sky.png"),
..Default::default()
},
tile: Tile { position },
tile_state: TileState {
timer: Timer::from_seconds(1.0, TimerMode::Repeating),
},
}
}
}