From 70cce2c5e9c599580142a302e47980ffcfc11ff1 Mon Sep 17 00:00:00 2001 From: StephenAdamson Date: Fri, 13 Dec 2024 18:29:27 +0000 Subject: [PATCH] tilemap part 1 --- src/game.rs | 54 +++++++++++++++++------------------ src/main.rs | 1 + src/tiles.rs | 81 ++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 102 insertions(+), 34 deletions(-) diff --git a/src/game.rs b/src/game.rs index 60e1c03..a9c8c25 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,16 +1,21 @@ use crate::citizen::Citizen; use crate::item::{Item, ItemBundle}; -use crate::tile::{FloorTile, Tile, TileState}; +use crate::tiles::TilePrefab; use bevy::prelude::*; use rand::prelude::*; pub const PIXEL_RATIO: f32 = 4.0; -pub fn setup_level(mut commands: Commands, asset_server: Res) { - setup_tilemap(&mut commands, &asset_server); +#[derive(Resource)] +pub struct TileMap { + pub tiles: Vec>>, +} + +pub fn setup_level(mut commands: Commands, asset_server: Res, mut tilemap: ResMut) { + setup_tilemap(&mut commands, &asset_server, tilemap); for x in 0..25 { - for y in 0..25 { + for y in 0..250 { if random::() < 0.1 { commands.spawn(Citizen::new( &asset_server, @@ -21,9 +26,11 @@ pub fn setup_level(mut commands: Commands, asset_server: Res) { } } -fn setup_tilemap(commands: &mut Commands, asset_server: &Res) { +fn setup_tilemap(commands: &mut Commands, asset_server: &Res, mut tilemap: ResMut) { for x in 0..25 { + let mut row:Vec> = Vec::new(); for y in 0..25 { + let mut column:Vec = Vec::new(); for z in 0..4 { let position = Vec3::new( x as f32 * 16. * PIXEL_RATIO, @@ -32,15 +39,21 @@ fn setup_tilemap(commands: &mut Commands, asset_server: &Res) { ); let mut noitem: bool = false; - let texture: Handle; + let tile_entity: Entity; if random::() < 0.4 { - texture = asset_server.load("grass.png"); + tile_entity = commands + .spawn(TilePrefab::grass(position, asset_server)) + .id(); } else if random::() < 0.2 { - texture = asset_server.load("dirt.png"); + tile_entity = commands + .spawn(TilePrefab::dirt(position, asset_server)) + .id(); } else if random::() < 0.1 { - texture = asset_server.load("rock.png"); + tile_entity = commands + .spawn(TilePrefab::rock(position, asset_server)) + .id(); } else { - texture = asset_server.load("sky.png"); + tile_entity = commands.spawn(TilePrefab::air(position, asset_server)).id(); noitem = true; }; @@ -82,30 +95,15 @@ fn setup_tilemap(commands: &mut Commands, asset_server: &Res) { } } - let tile_entity = commands - .spawn(( - Transform::from_translation(position).with_scale(Vec3::splat(PIXEL_RATIO)), - Sprite { - image: texture, - ..Default::default() - }, - FloorTile { - walkable: random::() < 0.7, - astar_weight: random::() % 10 + 1, - }, - Tile { position: position }, - TileState { - timer: Timer::from_seconds(1., TimerMode::Repeating), - }, - )) - .id(); - let mut child_entities = Vec::new(); for item in items { child_entities.push(commands.spawn(item).id()); } commands.entity(tile_entity).add_children(&child_entities); + column.push(tile_entity); } + row.push(column); } + tilemap.tiles.push(row); } } diff --git a/src/main.rs b/src/main.rs index 63e28ee..505ae56 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ mod citizen; mod camera; mod item; mod tile; +mod tiles; fn main() { App::new() diff --git a/src/tiles.rs b/src/tiles.rs index d278d69..cae8a69 100644 --- a/src/tiles.rs +++ b/src/tiles.rs @@ -1,9 +1,78 @@ use bevy::prelude::*; +use crate::game::PIXEL_RATIO; -pub enum Tiles{ - air, - grass, - dirt, - rock, +#[derive(Component)] +#[require(Sprite)] +pub struct Tile { + pub position: Vec3, } -// BUNDLES!! \ No newline at end of file + +#[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) -> 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) -> 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) -> 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) -> 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), + }, + } + } +} \ No newline at end of file