Basic movement system for workers

master
hheik 2025-02-26 20:43:57 +02:00
parent beaab7e97f
commit bf50c19ba0
6 changed files with 54 additions and 5 deletions

View File

@ -8,8 +8,11 @@ pub struct DebugSet;
impl Plugin for DebugPlugin {
fn build(&self, app: &mut App) {
app.configure_sets(Last, DebugSet.run_if(is_debug_enabled))
.configure_sets(PostUpdate, DebugSet.run_if(is_debug_enabled));
app.configure_sets(First, DebugSet.run_if(is_debug_enabled))
.configure_sets(PreUpdate, DebugSet.run_if(is_debug_enabled))
.configure_sets(Update, DebugSet.run_if(is_debug_enabled))
.configure_sets(PostUpdate, DebugSet.run_if(is_debug_enabled))
.configure_sets(Last, DebugSet.run_if(is_debug_enabled));
app.insert_resource(DebugMode::off())
.insert_resource(DebugDraw::default());

View File

@ -3,6 +3,7 @@ use bevy::prelude::*;
use bevy_prototype_lyon::prelude::*;
use bevy_rapier2d::prelude::*;
mod creature;
mod item;
mod prefab;
mod systems;
@ -22,10 +23,18 @@ pub fn init(app: &mut App) {
.register_type::<item::Inventory>()
.register_type::<work::WorkDuration>()
.register_type::<work::Worker>()
.register_type::<creature::Mover>()
.register_type::<prefab::Glorb>()
.register_type::<prefab::Tree>()
.add_systems(Startup, systems::setup_2d)
.add_systems(Update, (systems::demo_2d, systems::work_select))
.add_systems(
Update,
(
systems::demo_2d,
systems::work_select,
systems::worker_movement,
),
)
.add_systems(PostUpdate, item::update_item_sprite)
.add_systems(Update, (systems::draw_job_targets).in_set(debug::DebugSet));
}

13
src/game/creature.rs Normal file
View File

@ -0,0 +1,13 @@
use bevy::prelude::*;
#[derive(Copy, Clone, Debug, Component, Reflect)]
#[reflect(Component)]
pub struct Mover {
pub speed: f32,
}
impl Default for Mover {
fn default() -> Self {
Self { speed: 100.0 }
}
}

View File

@ -1,5 +1,6 @@
use bevy::{prelude::*, sprite::Anchor};
use bevy_rapier2d::prelude::*;
use creature::Mover;
use item::{Inventory, Item, ItemSource, ItemStack, Stockpile};
use work::{WorkDuration, Worker};
@ -17,8 +18,8 @@ use crate::util::SpriteLoader;
SpriteLoader(|| SpriteLoader::from("sprites/glorb.png")),
Worker,
Inventory(|| Inventory::with_capacity(1)),
Velocity,
RigidBody(|| RigidBody::KinematicVelocityBased),
RigidBody(|| RigidBody::KinematicPositionBased),
Mover,
)]
pub struct Glorb;

View File

@ -1,5 +1,7 @@
mod creature;
mod demo;
mod worker;
pub use creature::*;
pub use demo::*;
pub use worker::*;

View File

@ -0,0 +1,21 @@
use bevy::prelude::*;
use crate::game::{creature::Mover, work::Worker};
pub fn worker_movement(
mut worker_query: Query<(Entity, &Mover, &Worker, &mut Transform)>,
global_query: Query<&GlobalTransform>,
time: Res<Time>,
) {
for (entity, mover, worker, mut transform) in worker_query.iter_mut() {
let Some(task) = worker.0 else { continue };
let (Ok(from), Ok(to)) = (global_query.get(entity), global_query.get(task.target)) else {
continue;
};
let diff = (to.translation() - from.translation()).xy();
let dist = diff.length().max(0.);
let dir = diff.normalize_or_zero();
let movement = dir.extend(0.) * mover.speed * time.delta_secs();
transform.translation += movement.clamp_length_max(dist);
}
}