diff options
| author | Mel <einebeere@gmail.com> | 2023-12-07 01:26:04 +0100 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2023-12-07 01:26:04 +0100 |
| commit | 581f50e0bd45a19282d7958975997d376512b195 (patch) | |
| tree | db42e31524efc49caab06efeb3d1a1331ec4f2b5 /src/Entities | |
| parent | acc6e0e53d981428c15baf5b7efe568d98044290 (diff) | |
| download | meowcraft-581f50e0bd45a19282d7958975997d376512b195.tar.zst meowcraft-581f50e0bd45a19282d7958975997d376512b195.zip | |
AABB-AABB dynamic-static collision response with sliding
Diffstat (limited to 'src/Entities')
| -rw-r--r-- | src/Entities/Player.cpp | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index 4fa481e..5d41ad0 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -19,10 +19,10 @@ void Player::update(const Time& time, GFX::Window& window, GFX::Camera& camera, auto destination = m_transform.position() + direction * move_speed; auto collisions = colliding_terrain(destination, world); - if (!collisions.empty()) { - for (auto collision : collisions) { - destination = collision_reposition(m_transform.position(), destination, collision); - } + for (auto collision : collisions) { + auto original = destination; + destination = collision_reposition(m_transform.position(), destination, collision); + if (!original.mostly_equal(destination)) break; } move_to(destination); @@ -97,7 +97,7 @@ Position::World Player::position_for_bounding_box(AABB box) { Position::World Player::collision_reposition(Position::World from, Position::World to, AABB colliding) { if (from == to) return from; - auto resulting_bounding_box = bounding_box_for_position(from).cast_box(to - from, colliding); + auto resulting_bounding_box = bounding_box_for_position(from).collision_response(to - from, colliding); return position_for_bounding_box(resulting_bounding_box); // Ugly, we convert to AABB and back. } |
