merge: Merge 2D Farming Grid feature branch

This commit is contained in:
Dominik Bernroider
2025-11-19 14:34:48 +00:00
parent 5c01d599ce
commit 40a8ccab02
13 changed files with 121 additions and 4 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
src/components/mod.rs Normal file
View File

@@ -0,0 +1,2 @@
pub mod pom;
pub mod tile;

23
src/components/tile.rs Normal file
View File

@@ -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<Vec<Entity>>,
}

View File

@@ -25,6 +25,7 @@ fn main() {
plugins::CorePlugin, plugins::CorePlugin,
plugins::StartScreenPlugin, plugins::StartScreenPlugin,
plugins::GameScreenPlugin, plugins::GameScreenPlugin,
plugins::GridPlugin,
)) ))
.run(); .run();
} }

View File

@@ -1,6 +1,5 @@
use crate::components::*; use crate::components::*;
use crate::states::*; use crate::states::*;
use bevy::color::palettes::css::GREEN;
use bevy::prelude::*; use bevy::prelude::*;
use bevy_aseprite_ultra::prelude::*; use bevy_aseprite_ultra::prelude::*;
@@ -15,15 +14,16 @@ impl Plugin for GameScreenPlugin {
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) { fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn(( commands.spawn((
Pom, pom::Pom,
AseAnimation { 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), animation: Animation::tag("sleep-sit-start").with_repeat(AnimationRepeat::Loop),
}, },
Sprite::default(), 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) { fn cleanup(mut commands: Commands) {

89
src/plugins/grid.rs Normal file
View File

@@ -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<AssetServer>) {
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<Entity, With<Tile>>) {
for tile_entity in tile_query.iter() {
commands.entity(tile_entity).despawn();
}
commands.remove_resource::<Grid>();
}
fn update_tile_colors(
mut query: Query<(&TileState, &mut AseSlice)>,
asset_server: Res<AssetServer>,
) {
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"),
};
}
}

View File

@@ -1,7 +1,9 @@
pub mod core; pub mod core;
pub mod game_screen; pub mod game_screen;
pub mod grid;
pub mod start_screen; pub mod start_screen;
pub use core::CorePlugin; pub use core::CorePlugin;
pub use game_screen::GameScreenPlugin; pub use game_screen::GameScreenPlugin;
pub use grid::GridPlugin;
pub use start_screen::StartScreenPlugin; pub use start_screen::StartScreenPlugin;