debris hereta brillantor i velocitat
This commit is contained in:
@@ -47,7 +47,9 @@ void DebrisManager::explotar(const std::shared_ptr<Graphics::Shape>& shape,
|
||||
const Punt& centre,
|
||||
float angle,
|
||||
float escala,
|
||||
float velocitat_base) {
|
||||
float velocitat_base,
|
||||
float brightness,
|
||||
const Punt& velocitat_objecte) {
|
||||
if (!shape || !shape->es_valida()) {
|
||||
return;
|
||||
}
|
||||
@@ -94,17 +96,18 @@ void DebrisManager::explotar(const std::shared_ptr<Graphics::Shape>& shape,
|
||||
debris->p1 = world_p1;
|
||||
debris->p2 = world_p2;
|
||||
|
||||
// 4. Calcular direcció perpendicular
|
||||
Punt direccio = calcular_direccio_perpendicular(world_p1, world_p2);
|
||||
// 4. Calcular direcció d'explosió (radial, des del centre cap a fora)
|
||||
Punt direccio = calcular_direccio_explosio(world_p1, world_p2, centre);
|
||||
|
||||
// 5. Velocitat inicial (base ± variació aleatòria)
|
||||
// 5. Velocitat inicial (base ± variació aleatòria + velocitat heretada)
|
||||
float speed =
|
||||
velocitat_base +
|
||||
((std::rand() / static_cast<float>(RAND_MAX)) * 2.0f - 1.0f) *
|
||||
Defaults::Physics::Debris::VARIACIO_VELOCITAT;
|
||||
|
||||
debris->velocitat.x = direccio.x * speed;
|
||||
debris->velocitat.y = direccio.y * speed;
|
||||
// Heredar velocitat de l'objecte original (suma vectorial)
|
||||
debris->velocitat.x = direccio.x * speed + velocitat_objecte.x;
|
||||
debris->velocitat.y = direccio.y * speed + velocitat_objecte.y;
|
||||
debris->acceleracio = Defaults::Physics::Debris::ACCELERACIO;
|
||||
|
||||
// 6. Rotació lenta aleatòria
|
||||
@@ -126,7 +129,10 @@ void DebrisManager::explotar(const std::shared_ptr<Graphics::Shape>& shape,
|
||||
debris->temps_max = Defaults::Physics::Debris::TEMPS_VIDA;
|
||||
debris->factor_shrink = Defaults::Physics::Debris::SHRINK_RATE;
|
||||
|
||||
// 8. Activar
|
||||
// 8. Heredar brightness
|
||||
debris->brightness = brightness;
|
||||
|
||||
// 9. Activar
|
||||
debris->actiu = true;
|
||||
}
|
||||
}
|
||||
@@ -206,8 +212,14 @@ void DebrisManager::dibuixar() const {
|
||||
if (!debris.actiu)
|
||||
continue;
|
||||
|
||||
// Dibuixar segment de línia
|
||||
Rendering::linea(renderer_, static_cast<int>(debris.p1.x), static_cast<int>(debris.p1.y), static_cast<int>(debris.p2.x), static_cast<int>(debris.p2.y), true);
|
||||
// Dibuixar segment de línia amb brightness heretat
|
||||
Rendering::linea(renderer_,
|
||||
static_cast<int>(debris.p1.x),
|
||||
static_cast<int>(debris.p1.y),
|
||||
static_cast<int>(debris.p2.x),
|
||||
static_cast<int>(debris.p2.y),
|
||||
true,
|
||||
debris.brightness);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,16 +232,22 @@ Debris* DebrisManager::trobar_slot_lliure() {
|
||||
return nullptr; // Pool ple
|
||||
}
|
||||
|
||||
Punt DebrisManager::calcular_direccio_perpendicular(const Punt& p1,
|
||||
const Punt& p2) const {
|
||||
// 1. Calcular vector de la línia (p1 → p2)
|
||||
float dx = p2.x - p1.x;
|
||||
float dy = p2.y - p1.y;
|
||||
Punt DebrisManager::calcular_direccio_explosio(const Punt& p1,
|
||||
const Punt& p2,
|
||||
const Punt& centre_objecte) const {
|
||||
// 1. Calcular centre del segment
|
||||
float centro_seg_x = (p1.x + p2.x) / 2.0f;
|
||||
float centro_seg_y = (p1.y + p2.y) / 2.0f;
|
||||
|
||||
// 2. Normalitzar (obtenir vector unitari)
|
||||
// 2. Calcular vector des del centre de l'objecte cap al centre del segment
|
||||
// Això garanteix que la direcció sempre apunte cap a fora (direcció radial)
|
||||
float dx = centro_seg_x - centre_objecte.x;
|
||||
float dy = centro_seg_y - centre_objecte.y;
|
||||
|
||||
// 3. Normalitzar (obtenir vector unitari)
|
||||
float length = std::sqrt(dx * dx + dy * dy);
|
||||
if (length < 0.001f) {
|
||||
// Línia degenerada, retornar direcció aleatòria
|
||||
// Segment al centre (cas extrem molt improbable), retornar direcció aleatòria
|
||||
float angle_rand =
|
||||
(std::rand() / static_cast<float>(RAND_MAX)) * 2.0f * Defaults::Math::PI;
|
||||
return {std::cos(angle_rand), std::sin(angle_rand)};
|
||||
@@ -238,26 +256,15 @@ Punt DebrisManager::calcular_direccio_perpendicular(const Punt& p1,
|
||||
dx /= length;
|
||||
dy /= length;
|
||||
|
||||
// 3. Rotar 90° (perpendicular)
|
||||
// Rotació 90° sentit antihorari: (x,y) → (-y, x)
|
||||
float perp_x = -dy;
|
||||
float perp_y = dx;
|
||||
|
||||
// 4. Afegir variació aleatòria petita (±15°)
|
||||
// 4. Afegir variació aleatòria petita (±15°) per varietat visual
|
||||
float angle_variacio =
|
||||
((std::rand() % 30) - 15) * Defaults::Math::PI / 180.0f;
|
||||
|
||||
float cos_v = std::cos(angle_variacio);
|
||||
float sin_v = std::sin(angle_variacio);
|
||||
|
||||
float final_x = perp_x * cos_v - perp_y * sin_v;
|
||||
float final_y = perp_x * sin_v + perp_y * cos_v;
|
||||
|
||||
// 5. Afegir ± direcció aleatòria (50% probabilitat d'invertir)
|
||||
if (std::rand() % 2 == 0) {
|
||||
final_x = -final_x;
|
||||
final_y = -final_y;
|
||||
}
|
||||
float final_x = dx * cos_v - dy * sin_v;
|
||||
float final_y = dx * sin_v + dy * cos_v;
|
||||
|
||||
return {final_x, final_y};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user