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²
// 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 {
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
// Explosions (debris physics)
+6 -10
View File
@@ -87,16 +87,12 @@ namespace Systems::Collision {
}
// *** COLISIÓN bullet → enemy ***
// Empuje físico: impulse en la dirección bullet→enemy (fallback a la
// dirección de la bala si están exactamente solapados).
Vec2 normal = enemy.getCenter() - bullet.getCenter();
if (normal.lengthSquared() > 0.000001F) {
normal = normal.normalized();
} else {
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);
// Empuje físico cuasi-realista: el impulse és el moment de la bala
// (m·v) multiplicat pel factor de transferència. Direcció = vector
// velocity de la bala (cap a on viatjava).
const Vec2 IMPULSE = bullet.getBody().velocity *
(bullet.getBody().mass * Defaults::Physics::Bullet::IMPACT_MOMENTUM_FACTOR);
enemy.applyImpulse(IMPULSE);
const uint8_t SHOOTER = bullet.getOwnerId();