From df744338f139b8a2c6018ff1e25610e233438e3b Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 2 Dec 2025 10:01:31 +0100 Subject: [PATCH] enemics ja no ixen del area de joc --- source/game/constants.hpp | 19 +++++++++++++++++++ source/game/entities/bala.cpp | 8 +++++++- source/game/entities/enemic.cpp | 23 +++++++++++++++++------ source/game/entities/nau.cpp | 20 ++++++++++++-------- 4 files changed, 55 insertions(+), 15 deletions(-) diff --git a/source/game/constants.hpp b/source/game/constants.hpp index 3aeba03..42453dc 100644 --- a/source/game/constants.hpp +++ b/source/game/constants.hpp @@ -39,4 +39,23 @@ inline void obtenir_limits_zona(float& min_x, float& max_x, float& min_y, float& min_y = zona.y; max_y = zona.y + zona.h; } + +// Obtenir límits segurs (compensant radi de l'entitat) +inline void obtenir_limits_zona_segurs(float radi, float& min_x, float& max_x, + float& min_y, float& max_y) { + const auto& zona = Defaults::Zones::PLAYAREA; + constexpr float MARGE_SEGURETAT = 10.0f; // Safety margin + + min_x = zona.x + radi + MARGE_SEGURETAT; + max_x = zona.x + zona.w - radi - MARGE_SEGURETAT; + min_y = zona.y + radi + MARGE_SEGURETAT; + max_y = zona.y + zona.h - radi - MARGE_SEGURETAT; +} + +// Obtenir centre de l'àrea de joc +inline void obtenir_centre_zona(float& centre_x, float& centre_y) { + const auto& zona = Defaults::Zones::PLAYAREA; + centre_x = zona.x + zona.w / 2.0f; + centre_y = zona.y + zona.h / 2.0f; +} } // namespace Constants diff --git a/source/game/entities/bala.cpp b/source/game/entities/bala.cpp index 37885fa..306ce41 100644 --- a/source/game/entities/bala.cpp +++ b/source/game/entities/bala.cpp @@ -84,7 +84,13 @@ void Bala::mou(float delta_time) { centre_.x += dx; // Desactivar si surt de la zona de joc (no rebota com els ORNIs) - if (!Constants::dins_zona_joc(centre_.x, centre_.y)) { + // CORRECCIÓ: Usar límits segurs amb radi de la bala + float min_x, max_x, min_y, max_y; + Constants::obtenir_limits_zona_segurs(Defaults::Entities::BULLET_RADIUS, + min_x, max_x, min_y, max_y); + + if (centre_.x < min_x || centre_.x > max_x || + centre_.y < min_y || centre_.y > max_y) { esta_ = false; } } diff --git a/source/game/entities/enemic.cpp b/source/game/entities/enemic.cpp index 0e11852..5040f05 100644 --- a/source/game/entities/enemic.cpp +++ b/source/game/entities/enemic.cpp @@ -37,8 +37,16 @@ void Enemic::inicialitzar() { // fitxer Només inicialitzem l'estat de la instància // Posició aleatòria dins de l'àrea de joc - centre_.x = static_cast((std::rand() % 580) + 30); // 30-610 - centre_.y = static_cast((std::rand() % 420) + 30); // 30-450 + // Calcular rangs segurs amb radi de l'enemic + float min_x, max_x, min_y, max_y; + Constants::obtenir_limits_zona_segurs(Defaults::Entities::ENEMY_RADIUS, + min_x, max_x, min_y, max_y); + + // Spawn aleatori dins dels límits segurs + int range_x = static_cast(max_x - min_x); + int range_y = static_cast(max_y - min_y); + centre_.x = static_cast((std::rand() % range_x) + static_cast(min_x)); + centre_.y = static_cast((std::rand() % range_y) + static_cast(min_y)); // Angle aleatori de moviment angle_ = (std::rand() % 360) * Constants::PI / 180.0f; @@ -91,14 +99,16 @@ void Enemic::mou(float delta_time) { float new_y = centre_.y + dy; float new_x = centre_.x + dx; - // Obtenir límits de la zona de joc + // Obtenir límits segurs compensant el radi de l'enemic float min_x, max_x, min_y, max_y; - Constants::obtenir_limits_zona(min_x, max_x, min_y, max_y); + Constants::obtenir_limits_zona_segurs(Defaults::Entities::ENEMY_RADIUS, + min_x, max_x, min_y, max_y); // Lògica Pascal: Actualitza Y si dins, sinó ajusta angle aleatòriament // if (dy>marge_dalt) and (dy min_y && new_y < max_y) { + // CORRECCIÓ: Usar inequalitats inclusives (>= i <=) per evitar fugides + if (new_y >= min_y && new_y <= max_y) { centre_.y = new_y; } else { // Pequeño ajuste aleatorio: (random(256)/512)*(random(3)-1) @@ -113,7 +123,8 @@ void Enemic::mou(float delta_time) { // Lògica Pascal: Actualitza X si dins, sinó ajusta angle aleatòriament // if (dx>marge_esq) and (dx min_x && new_x < max_x) { + // CORRECCIÓ: Usar inequalitats inclusives (>= i <=) per evitar fugides + if (new_x >= min_x && new_x <= max_x) { centre_.x = new_x; } else { float rand1 = (static_cast(std::rand() % 256) / 512.0f); diff --git a/source/game/entities/nau.cpp b/source/game/entities/nau.cpp index 82096a1..095e5b3 100644 --- a/source/game/entities/nau.cpp +++ b/source/game/entities/nau.cpp @@ -36,9 +36,11 @@ void Nau::inicialitzar() { // [NUEVO] Ja no cal configurar punts polars - la geometria es carrega del // fitxer Només inicialitzem l'estat de la instància - // Posició inicial al centre de la pantalla - centre_.x = 320.0f; - centre_.y = 240.0f; + // Posició inicial al centre de l'àrea de joc + float centre_x, centre_y; + Constants::obtenir_centre_zona(centre_x, centre_y); + centre_.x = centre_x; // 320 + centre_.y = centre_y; // 213 (not 240!) // Estat inicial angle_ = 0.0f; @@ -121,16 +123,18 @@ void Nau::aplicar_fisica(float delta_time) { (velocitat_ * delta_time) * std::cos(angle_ - Constants::PI / 2.0f) + centre_.x; - // Boundary checking - només actualitzar si dins de la zona de joc - // Acumulació directa amb precisió subpíxel + // Boundary checking amb radi de la nau + // CORRECCIÓ: Usar límits segurs i inequalitats inclusives float min_x, max_x, min_y, max_y; - Constants::obtenir_limits_zona(min_x, max_x, min_y, max_y); + Constants::obtenir_limits_zona_segurs(Defaults::Entities::SHIP_RADIUS, + min_x, max_x, min_y, max_y); - if (dy > min_y && dy < max_y) { + // Inequalitats inclusives (>= i <=) + if (dy >= min_y && dy <= max_y) { centre_.y = dy; } - if (dx > min_x && dx < max_x) { + if (dx >= min_x && dx <= max_x) { centre_.x = dx; }