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:
@@ -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)
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user