enemics ja no ixen del area de joc

This commit is contained in:
2025-12-02 10:01:31 +01:00
parent 8803fc3806
commit df744338f1
4 changed files with 55 additions and 15 deletions

View File

@@ -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;
}
}

View File

@@ -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<float>((std::rand() % 580) + 30); // 30-610
centre_.y = static_cast<float>((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<int>(max_x - min_x);
int range_y = static_cast<int>(max_y - min_y);
centre_.x = static_cast<float>((std::rand() % range_x) + static_cast<int>(min_x));
centre_.y = static_cast<float>((std::rand() % range_y) + static_cast<int>(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<marge_baix) then orni.centre.y:=round(Dy)
// else orni.angle:=orni.angle+(random(256)/512)*(random(3)-1);
if (new_y > 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<marge_dret) then orni.centre.x:=round(Dx)
// else orni.angle:=orni.angle+(random(256)/512)*(random(3)-1);
if (new_x > 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<float>(std::rand() % 256) / 512.0f);

View File

@@ -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;
}