tune(bullet): empuje cuasi-físico (momento real de la bala)

Sustitueix IMPACT_IMPULSE (magnitud arbitrària radial) per
IMPACT_MOMENTUM_FACTOR (factor de transferència del moment de la bala).

El impulse ara és bullet.body.velocity * (bullet.body.mass * factor),
és a dir el moment lineal real de la bala, dirigit cap a on viatjava.
Amb factor=1.0 i la bala (m=0.5, v=700 px/s):
  - Pentagon (m=5)  → Δv = 70 px/s (doble de la seva velocity base)
  - Quadrat  (m=8)  → Δv = 44 px/s
  - Molinillo (m=4) → Δv = 88 px/s

Visiblement notable durant el segon de "ferit" abans de l'explosió.
El factor és tunable per pujar/baixar segons gusts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-21 10:37:23 +02:00
parent 2cf5292b16
commit ff5dfab94d
2 changed files with 10 additions and 11 deletions
+4 -1
View File
@@ -11,8 +11,11 @@ namespace Defaults::Physics {
constexpr float FRICTION = 20.0F; // px/s² constexpr float FRICTION = 20.0F; // px/s²
// Bullet — impacto físico contra enemigo (impulse mass-aware). // Bullet — impacto físico contra enemigo (impulse mass-aware).
// Model: el impulse és el moment lineal de la bala (m·v) multiplicat per
// un factor de transferència [0..1]. 1.0 = transfereix tot el moment
// (col·lisió perfectament inelàstica), 0.5 = transfereix la meitat.
namespace Bullet { namespace Bullet {
constexpr float IMPACT_IMPULSE = 50.0F; // Magnitud del impulse en la dirección bullet→enemy constexpr float IMPACT_MOMENTUM_FACTOR = 1.0F; // Factor de transferència de moment bala→enemic
} // namespace Bullet } // namespace Bullet
// Explosions (debris physics) // Explosions (debris physics)
+6 -10
View File
@@ -87,16 +87,12 @@ namespace Systems::Collision {
} }
// *** COLISIÓN bullet → enemy *** // *** COLISIÓN bullet → enemy ***
// Empuje físico: impulse en la dirección bullet→enemy (fallback a la // Empuje físico cuasi-realista: el impulse és el moment de la bala
// dirección de la bala si están exactamente solapados). // (m·v) multiplicat pel factor de transferència. Direcció = vector
Vec2 normal = enemy.getCenter() - bullet.getCenter(); // velocity de la bala (cap a on viatjava).
if (normal.lengthSquared() > 0.000001F) { const Vec2 IMPULSE = bullet.getBody().velocity *
normal = normal.normalized(); (bullet.getBody().mass * Defaults::Physics::Bullet::IMPACT_MOMENTUM_FACTOR);
} else { enemy.applyImpulse(IMPULSE);
const Vec2 BVEL = bullet.getBody().velocity;
normal = (BVEL.lengthSquared() > 0.0F) ? BVEL.normalized() : Vec2{.x = 0.0F, .y = -1.0F};
}
enemy.applyImpulse(normal * Defaults::Physics::Bullet::IMPACT_IMPULSE);
const uint8_t SHOOTER = bullet.getOwnerId(); const uint8_t SHOOTER = bullet.getOwnerId();