diff --git a/src/game.rs b/src/game.rs index a9c8c25..48ed35b 100644 --- a/src/game.rs +++ b/src/game.rs @@ -6,16 +6,11 @@ use rand::prelude::*; pub const PIXEL_RATIO: f32 = 4.0; -#[derive(Resource)] -pub struct TileMap { - pub tiles: Vec>>, -} +pub fn setup_level(mut commands: Commands, asset_server: Res) { + setup_tilemap(&mut commands, &asset_server); -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..250 { + for x in -50..50 { + for y in -25..25 { if random::() < 0.1 { commands.spawn(Citizen::new( &asset_server, @@ -26,84 +21,80 @@ pub fn setup_level(mut commands: Commands, asset_server: Res, mut t } } -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(); +fn setup_tilemap(commands: &mut Commands, asset_server: &Res) { + for x in -50..50 { + for y in -25..25 { for z in 0..4 { let position = Vec3::new( x as f32 * 16. * PIXEL_RATIO, y as f32 * 16. * PIXEL_RATIO, -z as f32, ); - let mut noitem: bool = false; - - let tile_entity: Entity; - if random::() < 0.4 { - tile_entity = commands - .spawn(TilePrefab::grass(position, asset_server)) - .id(); - } else if random::() < 0.2 { - tile_entity = commands - .spawn(TilePrefab::dirt(position, asset_server)) - .id(); - } else if random::() < 0.1 { - tile_entity = commands - .spawn(TilePrefab::rock(position, asset_server)) - .id(); - } else { - tile_entity = commands.spawn(TilePrefab::air(position, asset_server)).id(); - noitem = true; - }; let mut items: Vec = vec![]; - if !noitem { - if random::() < 0.1 { - items.push(ItemBundle { - transform: Transform::from_translation(Vec3::new(0., 0., 0.1)), - sprite: Sprite { - image: asset_server.load("beer.png"), - ..Default::default() - }, - item: Item::new(), - visibility: Visibility::Visible, - }); - } - if random::() < 0.1 { - items.push(ItemBundle { - transform: Transform::from_translation(Vec3::new(0., 0., 0.1)), - sprite: Sprite { - image: asset_server.load("chalice.png"), - ..Default::default() - }, - item: Item::new(), - visibility: Visibility::Visible, - }); - } - if random::() < 0.1 { - items.push(ItemBundle { - transform: Transform::from_translation(Vec3::new(0., 0., 0.1)), - sprite: Sprite { - image: asset_server.load("fish.png"), - ..Default::default() - }, - item: Item::new(), - visibility: Visibility::Visible, - }); - } + if random::() < 0.1 { + items.push(ItemBundle { + transform: Transform::from_translation(Vec3::new(0., 0., 0.1)), + sprite: Sprite { + image: asset_server.load("beer.png"), + ..Default::default() + }, + item: Item::new(), + visibility: Visibility::Visible, + }); + } + if random::() < 0.1 { + items.push(ItemBundle { + transform: Transform::from_translation(Vec3::new(0., 0., 0.1)), + sprite: Sprite { + image: asset_server.load("chalice.png"), + ..Default::default() + }, + item: Item::new(), + visibility: Visibility::Visible, + }); + } + if random::() < 0.1 { + items.push(ItemBundle { + transform: Transform::from_translation(Vec3::new(0., 0., 0.1)), + sprite: Sprite { + image: asset_server.load("fish.png"), + ..Default::default() + }, + item: Item::new(), + visibility: Visibility::Visible, + }); } - let mut child_entities = Vec::new(); - for item in items { - child_entities.push(commands.spawn(item).id()); + if random::() < 0.7 { + commands + .spawn(TilePrefab::grass(position, asset_server)) + .with_children(|parent| { + for item in items { + parent.spawn(item); + } + }); + } else if random::() < 0.2 { + commands + .spawn(TilePrefab::dirt(position, asset_server)) + .with_children(|parent| { + for item in items { + parent.spawn(item); + } + }); + } else if random::() < 0.1 { + commands + .spawn(TilePrefab::rock(position, asset_server)) + .with_children(|parent| { + for item in items { + parent.spawn(item); + } + }); + } else { + commands.spawn(TilePrefab::air(position, asset_server)); } - 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 505ae56..19b4b94 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,15 @@ use bevy::prelude::*; -mod game; -mod citizen; mod camera; +mod citizen; +mod game; mod item; mod tile; mod tiles; +use bevy::color::palettes::basic::WHITE; +use game::PIXEL_RATIO; + fn main() { App::new() .add_plugins( @@ -21,14 +24,43 @@ fn main() { .set(ImagePlugin::default_nearest()), ) .insert_resource(ClearColor(Color::srgb(0.1, 0.1, 0.15))) - .add_systems(Startup, ( - game::setup_level, - camera::spawn_panning_camera, - )) - .add_systems(FixedUpdate, ( - camera::camera_movement, - citizen::citizen_movement, - tile::tile_sprite_update, - )) + .add_systems(Startup, (game::setup_level, camera::spawn_panning_camera)) + .add_systems( + FixedUpdate, + ( + camera::camera_movement, + citizen::citizen_movement, + tile::tile_sprite_update, + ), + ) + .add_systems(FixedUpdate, draw_cursor) .run(); -} \ No newline at end of file +} + +fn draw_cursor( + camera_query: Single<(&Camera, &GlobalTransform)>, + windows: Query<&Window>, + mut gizmos: Gizmos, +) { + let (camera, camera_transform) = *camera_query; + + let Ok(window) = windows.get_single() else { + return; + }; + + let Some(cursor_position) = window.cursor_position() else { + return; + }; + + // Calculate a world position based on the cursor's position. + let Ok(point) = camera.viewport_to_world_2d(camera_transform, cursor_position) else { + return; + }; + println!( + "pos: {}, {}", + (point.x / (16. * PIXEL_RATIO)) as i32, + (point.y / (16. * PIXEL_RATIO)) as i32 + ); + + gizmos.circle_2d(point, 10., WHITE); +} diff --git a/src/tile.rs b/src/tile.rs index d510f52..ccf6684 100644 --- a/src/tile.rs +++ b/src/tile.rs @@ -15,14 +15,6 @@ impl Default for Tile { } } -impl Tile { - pub fn new(position: Vec3) -> Self { - Self { - position, - } - } -} - #[derive(Component)] #[require(Tile)] pub struct FloorTile { diff --git a/src/tiles.rs b/src/tiles.rs index cae8a69..c2abcd6 100644 --- a/src/tiles.rs +++ b/src/tiles.rs @@ -1,17 +1,7 @@ use bevy::prelude::*; +use crate::tile::{Tile, TileState}; use crate::game::PIXEL_RATIO; -#[derive(Component)] -#[require(Sprite)] -pub struct Tile { - pub position: Vec3, -} - -#[derive(Component)] -pub struct TileState { - pub timer: Timer, -} - #[derive(Bundle)] pub struct TilePrefab { transform: Transform,