diff --git a/assets/pom-idle.aseprite b/assets/pom/pom-idle.aseprite similarity index 100% rename from assets/pom-idle.aseprite rename to assets/pom/pom-idle.aseprite diff --git a/assets/pom-sleep.aseprite b/assets/pom/pom-sleep.aseprite similarity index 100% rename from assets/pom-sleep.aseprite rename to assets/pom/pom-sleep.aseprite diff --git a/assets/pom.aseprite b/assets/pom/pom.aseprite similarity index 100% rename from assets/pom.aseprite rename to assets/pom/pom.aseprite diff --git a/assets/tiles/tile-empty.aseprite b/assets/tiles/tile-empty.aseprite new file mode 100644 index 0000000..6be5620 Binary files /dev/null and b/assets/tiles/tile-empty.aseprite differ diff --git a/assets/tiles/tile-occupied.aseprite b/assets/tiles/tile-occupied.aseprite new file mode 100644 index 0000000..d892dc2 Binary files /dev/null and b/assets/tiles/tile-occupied.aseprite differ diff --git a/assets/tiles/tile-unclaimed.aseprite b/assets/tiles/tile-unclaimed.aseprite new file mode 100644 index 0000000..a20fa11 Binary files /dev/null and b/assets/tiles/tile-unclaimed.aseprite differ diff --git a/src/components/mod.rs b/src/components/mod.rs new file mode 100644 index 0000000..9cc5313 --- /dev/null +++ b/src/components/mod.rs @@ -0,0 +1,2 @@ +pub mod pom; +pub mod tile; diff --git a/src/components.rs b/src/components/pom.rs similarity index 100% rename from src/components.rs rename to src/components/pom.rs diff --git a/src/components/tile.rs b/src/components/tile.rs new file mode 100644 index 0000000..323b12e --- /dev/null +++ b/src/components/tile.rs @@ -0,0 +1,23 @@ +use bevy::prelude::*; +use bevy_aseprite_ultra::prelude::AseSlice; + +#[derive(Component)] +pub struct Tile { + pub x: u32, + pub y: u32, +} + +#[derive(Component, Default)] +pub enum TileState { + #[default] + Unclaimed, + Empty, + Occupied, +} + +#[derive(Resource)] +pub struct Grid { + pub width: u32, + pub height: u32, + pub tiles: Vec>, +} diff --git a/src/main.rs b/src/main.rs index 47c415e..e0a805b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,6 +25,7 @@ fn main() { plugins::CorePlugin, plugins::StartScreenPlugin, plugins::GameScreenPlugin, + plugins::GridPlugin, )) .run(); } diff --git a/src/plugins/game_screen.rs b/src/plugins/game_screen.rs index 10de080..7134098 100644 --- a/src/plugins/game_screen.rs +++ b/src/plugins/game_screen.rs @@ -1,6 +1,5 @@ use crate::components::*; use crate::states::*; -use bevy::color::palettes::css::GREEN; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; @@ -15,15 +14,16 @@ impl Plugin for GameScreenPlugin { fn setup(mut commands: Commands, asset_server: Res) { commands.spawn(( - Pom, + pom::Pom, AseAnimation { - aseprite: asset_server.load("pom-sleep.aseprite"), + aseprite: asset_server.load("pom/pom-sleep.aseprite"), animation: Animation::tag("sleep-sit-start").with_repeat(AnimationRepeat::Loop), }, Sprite::default(), + Transform::from_xyz(0.0, 0.0, 1.0), )); - commands.insert_resource(ClearColor(Color::from(GREEN))); + commands.insert_resource(ClearColor(Color::srgb(0.294, 0.412, 0.184))); } fn cleanup(mut commands: Commands) { diff --git a/src/plugins/grid.rs b/src/plugins/grid.rs new file mode 100644 index 0000000..1644bea --- /dev/null +++ b/src/plugins/grid.rs @@ -0,0 +1,89 @@ +use crate::{ + components::tile::{Grid, Tile, TileState}, + states::AppState, +}; +use bevy::prelude::*; +use bevy_aseprite_ultra::prelude::AseSlice; + +const TILE_SIZE: f32 = 32.0; +const GRID_WIDTH: u32 = 10; +const GRID_HEIGHT: u32 = 10; + +const GRID_START_X: f32 = -(GRID_WIDTH as f32 * TILE_SIZE) / 2.0 + TILE_SIZE / 2.0; +const GRID_START_Y: f32 = -(GRID_HEIGHT as f32 * TILE_SIZE) / 2.0 + TILE_SIZE / 2.0; + +pub struct GridPlugin; + +impl Plugin for GridPlugin { + fn build(&self, app: &mut App) { + app.add_systems(OnEnter(AppState::GameScreen), setup); + app.add_systems(OnExit(AppState::GameScreen), cleanup); + + app.add_systems( + Update, + update_tile_colors.run_if(in_state(AppState::GameScreen)), + ); + } +} + +fn setup(mut commands: Commands, asset_server: Res) { + let mut tiles = Vec::with_capacity(GRID_WIDTH as usize); + + for x in 0..GRID_WIDTH { + let mut column = Vec::with_capacity(GRID_HEIGHT as usize); + + for y in 0..GRID_HEIGHT { + let tile_entity = commands + .spawn(( + Tile { x, y }, + TileState::Unclaimed, + AseSlice { + name: "Unclaimed".into(), + aseprite: asset_server.load("tiles/tile-unclaimed.aseprite"), + }, + Sprite::default(), + Transform::from_xyz( + GRID_START_X + x as f32 * TILE_SIZE, + GRID_START_Y + y as f32 * TILE_SIZE, + 0.0, + ), + )) + .id(); + column.push(tile_entity); + } + tiles.push(column); + } + + commands.insert_resource(Grid { + width: GRID_WIDTH, + height: GRID_HEIGHT, + tiles, + }); +} + +fn cleanup(mut commands: Commands, tile_query: Query>) { + for tile_entity in tile_query.iter() { + commands.entity(tile_entity).despawn(); + } + commands.remove_resource::(); +} + +fn update_tile_colors( + mut query: Query<(&TileState, &mut AseSlice)>, + asset_server: Res, +) { + for (state, mut slice) in &mut query { + slice.name = match state { + TileState::Unclaimed => "Unclaimed", + TileState::Empty => "Empty", + TileState::Occupied => "Occupied", + } + .into(); + + slice.aseprite = match state { + TileState::Unclaimed => asset_server.load("tiles/tile-unclaimed.aseprite"), + TileState::Empty => asset_server.load("tiles/tile-empty.aseprite"), + TileState::Occupied => asset_server.load("tiles/tile-occupied.aseprite"), + }; + } +} diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs index 921ed70..9f2400c 100644 --- a/src/plugins/mod.rs +++ b/src/plugins/mod.rs @@ -1,7 +1,9 @@ pub mod core; pub mod game_screen; +pub mod grid; pub mod start_screen; pub use core::CorePlugin; pub use game_screen::GameScreenPlugin; +pub use grid::GridPlugin; pub use start_screen::StartScreenPlugin;