From 51ecf9530dae94341e2ba96453a4bf7e376ad33b Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Wed, 2 Sep 2026 00:05:29 -0700 Subject: character controller --- src/sim/entity/mod.rs | 41 +++++++++++++++++++++++++++++++++++++++++ src/sim/rb_manager/mod.rs | 4 ++-- 2 files changed, 43 insertions(+), 2 deletions(-) (limited to 'src/sim') diff --git a/src/sim/entity/mod.rs b/src/sim/entity/mod.rs index 9425f9b..4a8eda4 100644 --- a/src/sim/entity/mod.rs +++ b/src/sim/entity/mod.rs @@ -2,6 +2,7 @@ use glam::{IVec2, Vec2}; use rapier2d::{ dynamics::{RigidBody, RigidBodyBuilder, RigidBodyHandle}, geometry::{Collider, ColliderHandle}, + math::Pose2, }; use crate::{ @@ -123,6 +124,46 @@ impl EntityDef { EntityDef::from_cells(position, entity_cells, behaviour) } + + pub fn kinematic_from_cells( + position: Vec2, + cells: EntityCells, + behaviour: Option>, + ) -> Self { + let rb = RigidBodyBuilder::kinematic_velocity_based() + .translation(position) + .build(); + + let collider = RbManager::convex_hull_collider_from_marchable(&cells, Some(10)) + .mass(mass_from_cells(&cells.cells)) + .build(); + + EntityDef { + rb: Some(rb), + collider: Some(collider), + cells: Some(cells), + behaviour, + } + } + + pub fn kinematic_from_sprite( + position: Vec2, + path: &str, + behaviour: Option>, + ) -> Self { + let sprite_cells = load_sprite_to_cells(path); + let mut entity_cells = EntityCells { + cells: sprite_cells.cells, + size: IVec2::new(sprite_cells.width as i32, sprite_cells.height as i32), + }; + + entity_cells + .cells + .iter_mut() + .for_each(|c| c.set_entity_integrated(true)); + + EntityDef::kinematic_from_cells(position, entity_cells, behaviour) + } } #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] diff --git a/src/sim/rb_manager/mod.rs b/src/sim/rb_manager/mod.rs index 2b476d5..1be024a 100644 --- a/src/sim/rb_manager/mod.rs +++ b/src/sim/rb_manager/mod.rs @@ -11,7 +11,7 @@ use rapier2d::{ }; use crate::{ - config::{CELLS_TO_METRES, CHUNK_SIZE, PHYSICS_DELTA_TIME}, + config::{CELLS_TO_METRES, CHUNK_SIZE, GRAVITY, PHYSICS_DELTA_TIME}, sim::{ cell_manager::chunk::Chunk, lib::marching_squares::{Marchable, marching_squares_vertex_trace}, @@ -29,7 +29,7 @@ pub struct PhysicsManager { impl PhysicsManager { pub fn new() -> Self { let mut world = PhysicsWorld::new(); - let gravity = vec2(0.0, 9.81 * CELLS_TO_METRES); + let gravity = vec2(0.0, GRAVITY); world.gravity = gravity; world.integration_parameters = IntegrationParameters { // 20 pixels <-> 1 meter -- cgit v1.3.1