This commit is contained in:
2025-10-24 17:50:31 +02:00
parent 3cfb65320c
commit 4679255d60
8 changed files with 68 additions and 44 deletions

View File

@@ -551,19 +551,18 @@ void Game::handleTabeHitEffects() {
// Maneja la colisión entre bala y globos
auto Game::checkBulletBalloonCollision(const std::shared_ptr<Bullet>& bullet) -> bool {
for (auto& balloon : balloon_manager_->getBalloons()) {
return std::ranges::any_of(balloon_manager_->getBalloons(), [this, &bullet](auto& balloon) {
if (!balloon->isEnabled() || balloon->isInvulnerable()) {
continue;
return false;
}
if (!checkCollision(balloon->getCollider(), bullet->getCollider())) {
continue;
return false;
}
processBalloonHit(bullet, balloon);
return true;
}
return false;
});
}
// Procesa el impacto en un globo
@@ -1966,8 +1965,10 @@ void Game::handleGameOverEvents() {
void Game::buildPlayerDrawList(const Players& elements, Players& draw_list) {
draw_list.clear();
draw_list.reserve(elements.size());
for (const auto& e : elements) draw_list.push_back(e); // copia el shared_ptr
std::stable_sort(draw_list.begin(), draw_list.end(), [](const std::shared_ptr<Player>& a, const std::shared_ptr<Player>& b) {
for (const auto& e : elements) {
draw_list.push_back(e); // copia el shared_ptr
}
std::ranges::stable_sort(draw_list, [](const std::shared_ptr<Player>& a, const std::shared_ptr<Player>& b) {
return a->getZOrder() < b->getZOrder();
});
}
@@ -1981,31 +1982,42 @@ void Game::updatePlayerDrawList(const Players& elements, Players& draw_list) {
return;
}
// Dado que apuntan a los mismos elementos, basta ordenar por los z_order actuales.
std::stable_sort(draw_list.begin(), draw_list.end(), [](const std::shared_ptr<Player>& a, const std::shared_ptr<Player>& b) {
std::ranges::stable_sort(draw_list, [](const std::shared_ptr<Player>& a, const std::shared_ptr<Player>& b) {
return a->getZOrder() < b->getZOrder();
});
}
// Dibuja en el orden definido por draw_list
void Game::renderPlayerDrawList(const Players& draw_list) {
for (const auto& e : draw_list) e->render();
for (const auto& e : draw_list) {
e->render();
}
}
// Operaciones sobre z_order que mantienen la invariante y actualizan draw_list.
auto Game::findPlayerIndex(const Players& elems, const std::shared_ptr<Player>& who) -> size_t {
for (size_t i = 0; i < elems.size(); ++i)
if (elems[i] == who) return static_cast<int>(i); // compara shared_ptr directamente
for (size_t i = 0; i < elems.size(); ++i) {
if (elems[i] == who) {
return static_cast<int>(i); // compara shared_ptr directamente
}
}
return -1;
}
void Game::sendPlayerToBack(Players& elements, const std::shared_ptr<Player>& who, Players& draw_list) {
int idx = findPlayerIndex(elements, who);
if (idx < 0) return; // no encontrado
if (idx < 0) {
return; // no encontrado
}
const int OLD_Z = elements[idx]->getZOrder();
if (OLD_Z <= 0) return;
if (OLD_Z <= 0) {
return;
}
for (auto& p : elements) {
int z = p->getZOrder();
if (z < OLD_Z) { p->setZOrder(z + 1); }
if (z < OLD_Z) {
p->setZOrder(z + 1);
}
}
elements[idx]->setZOrder(0);
updatePlayerDrawList(elements, draw_list);
@@ -2013,13 +2025,19 @@ void Game::sendPlayerToBack(Players& elements, const std::shared_ptr<Player>& wh
void Game::bringPlayerToFront(Players& elements, const std::shared_ptr<Player>& who, Players& draw_list) {
int idx = findPlayerIndex(elements, who);
if (idx < 0) return; // no encontrado
if (idx < 0) {
return; // no encontrado
}
const int OLD_Z = elements[idx]->getZOrder();
const int N = static_cast<int>(elements.size());
if (OLD_Z >= N - 1) return;
if (OLD_Z >= N - 1) {
return;
}
for (auto& p : elements) {
int z = p->getZOrder();
if (z > OLD_Z) p->setZOrder(z - 1);
if (z > OLD_Z) {
p->setZOrder(z - 1);
}
}
elements[idx]->setZOrder(N - 1);
updatePlayerDrawList(elements, draw_list);