From 40a8ccab024a4965ebd78272159a9107aad54014 Mon Sep 17 00:00:00 2001 From: Dominik Bernroider Date: Wed, 19 Nov 2025 14:34:48 +0000 Subject: [PATCH] merge: Merge 2D Farming Grid feature branch --- assets/{ => pom}/pom-idle.aseprite | Bin assets/{ => pom}/pom-sleep.aseprite | Bin assets/{ => pom}/pom.aseprite | Bin assets/tiles/tile-empty.aseprite | Bin 0 -> 769 bytes assets/tiles/tile-occupied.aseprite | Bin 0 -> 1056 bytes assets/tiles/tile-unclaimed.aseprite | Bin 0 -> 829 bytes src/components/mod.rs | 2 + src/{components.rs => components/pom.rs} | 0 src/components/tile.rs | 23 ++++++ src/main.rs | 1 + src/plugins/game_screen.rs | 8 +- src/plugins/grid.rs | 89 +++++++++++++++++++++++ src/plugins/mod.rs | 2 + 13 files changed, 121 insertions(+), 4 deletions(-) rename assets/{ => pom}/pom-idle.aseprite (100%) rename assets/{ => pom}/pom-sleep.aseprite (100%) rename assets/{ => pom}/pom.aseprite (100%) create mode 100644 assets/tiles/tile-empty.aseprite create mode 100644 assets/tiles/tile-occupied.aseprite create mode 100644 assets/tiles/tile-unclaimed.aseprite create mode 100644 src/components/mod.rs rename src/{components.rs => components/pom.rs} (100%) create mode 100644 src/components/tile.rs create mode 100644 src/plugins/grid.rs 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 0000000000000000000000000000000000000000..6be5620ac9755df798893af15ea6bae946240b4e GIT binary patch literal 769 zcmZQ%W?*=*l#xLJ3>g_17*c>30TdV*L4phdKu8PF$i%?#>mvu)Rt}&AVnEEU0Jajz zx-1}@g#jq40AwgBn7C@#q*)sFhgsh*RJ*w#?cL#7zdxDHd>W9o&%k_2o_D5xkhhAF zjitSPi9teBbl$_{+5h9uJ~@5+&;S4bXRqDfQrDiDl@%ElROZyR#>nVqc=Gk?UH#L& zy7CR=K{hD>0|gHL16k}0K8cm7MGA(P(#A;AM!GWynf^NVL+9Zf)10-( zD_=(yOPHp296n*$er+Fn`^6s`?60h6{l6!daj|sm^cOi_uB5V+}7Z{kE@;JvZJSXSJwidxhuyLb=$?@A+5tvah?PuUp2>&v)s+(wwEm zE!kJ!^DobFdhHAhB31=p$N>R*puIh72$bMqTJTl>ZPW{9R*!FaN8W$`{kLxaeGv8U M+5Rti+ukVv08F~`Y5)KL literal 0 HcmV?d00001 diff --git a/assets/tiles/tile-occupied.aseprite b/assets/tiles/tile-occupied.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..d892dc2575057b897921ed3ea8c359d30a38e55a GIT binary patch literal 1056 zcmY#jVPJT$l#xLJ3>g_17*c>30TdV*L4phdKu8O)fSG~e*GDd}tz1A0#DJJx0c<6b zby+|*3j$n#gKSa&ItmW{16k}0K8cm7MGA)arHwG9jgfR48vr>e^a3USrxz>hW`*jAV&cRE9M*x-_3Q{falLFznNYOzicc&J!xU_ z@_&AImPc6|4W<=U9g$;MdSch+l4(;?>vCWJmfTip_4jS@%x&-g-uY5_XPsum9WJrR zgU|k_CuiPpKXU!k)yH+!-_KcP_qPAg>sn_imnnAi^s4fMPx9Gz8qan7Gf^rdKh%i( zxzF7zG9A_0^OkJXSf?7dR+7JMNuo;JN&c%Rf>y7wnQ9@oHX^I5sNu%}mma+5m zUHY#yXK8Uu_SN_N%X6Gw{{;pSs{%0O7}!t(O&l0#XG0D74lD4Sao@G&)sc|WR}<8q zu*O<_{cpeEQ^L!X#*G`BvtBMyXnN1^`-WNco9o`L64QN;K9AITtnpoIC#Q}4(_j1K zrYveJF@Bt$6Ts%Zm+J*-xvcM~h2F=}O##mi?Ei=O>CcS*F&#eLL0EWbx|fshiesjeBJC=j?0Us&ijN&RpNM zU3A{wOUCsg_17*c>30TdV*L4phdKu8O)mx+Pl*GCSptsFoL#DJJx0c<6b zby+|*3j$n#gKSa&1_~Vf2eQ~1d=e{DixdnorHzrKjSPVtB^1|lGKA(O=Okw4rlN$a0#G3c z^MPmuU>E?w|Npr_AF?WdISl_HfgnIFztetff8Bn` z`$y(`A1AZEH@2U+{tVk?$*)>}>ck&z+5D}4u3^tozp3kA$sG>=_4oF}jgKGq)aS`B z`P=>D#gSJZ?myin{Q7N|<>{=GHO0T$Prlr+{l~0h#|&2OS$!k@r$N$&nFlJGULAR} z%Wzk*{zKJOva@Tm(k!+*Ryx_O__^xC)ZC-aDbpWXZ;pRD?dRKbQpb$HhFO%|ux&q{ z>9hY!(ktgr`>*Hz3H#k}`>?0pWZOlLBA(9P+`UmwveImJ{`0x%H9`B9{@9$)aVhlu z^%KnH>wizzDPCRn=t|xtdC~Uczqb9+``qzs+w-lQn`RzaXmRXY)2p>US+Q?luUe*Q zciQ*V*{tOeT(3H(hiSoA{kKssm{~o( Z>, +} 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;