feat(enemy): els enemics poden disparar bales via tick d'IA

This commit is contained in:
2026-05-25 20:05:01 +02:00
parent 5ad433e63a
commit 14295ce859
18 changed files with 361 additions and 92 deletions
+13 -8
View File
@@ -354,7 +354,7 @@ auto GameScene::stepContinueScreen(float delta_time) -> bool {
// Enemies, bullets y efectos siguen moviéndose en background.
for (auto& enemy : enemies_) {
Systems::EnemyAi::tick(enemy, delta_time);
Systems::EnemyAi::move(enemy, delta_time);
enemy.update(delta_time);
}
for (auto& bullet : bullets_) {
@@ -381,7 +381,7 @@ auto GameScene::stepGameOver(float delta_time) -> bool {
// Enemies, bullets y efectos siguen moviéndose como fondo.
for (auto& enemy : enemies_) {
Systems::EnemyAi::tick(enemy, delta_time);
Systems::EnemyAi::move(enemy, delta_time);
enemy.update(delta_time);
}
for (auto& bullet : bullets_) {
@@ -431,7 +431,7 @@ void GameScene::stepDeathSequence(float delta_time) {
// aunque otros jugadores aún jueguen.
if (algun_mort) {
for (auto& enemy : enemies_) {
Systems::EnemyAi::tick(enemy, delta_time);
Systems::EnemyAi::move(enemy, delta_time);
enemy.update(delta_time);
}
for (auto& bullet : bullets_) {
@@ -531,9 +531,10 @@ void GameScene::runStagePlaying(float delta_time) {
ships_[i].update(delta_time);
}
}
for (auto& enemy : enemies_) {
Systems::EnemyAi::tick(enemy, delta_time);
enemy.update(delta_time);
auto ai_ctx = buildCollisionContext();
for (std::size_t i = 0; i < enemies_.size(); ++i) {
Systems::EnemyAi::tick(ai_ctx, enemies_[i], i, delta_time);
enemies_[i].update(delta_time);
}
// Col·lisions primer, després desactivació per fora-de-zone: així una bala que
@@ -567,8 +568,8 @@ void GameScene::runStageLevelCompleted(float delta_time) {
floating_score_manager_.update(delta_time);
}
void GameScene::runCollisionDetections() {
Systems::Collision::Context col_ctx{
auto GameScene::buildCollisionContext() -> Systems::Collision::Context {
return Systems::Collision::Context{
.ships = ships_,
.enemies = enemies_,
.bullets = bullets_,
@@ -581,6 +582,10 @@ void GameScene::runCollisionDetections() {
.match_config = match_config_,
.on_player_hit = [this](uint8_t pid) { tocado(pid); },
};
}
void GameScene::runCollisionDetections() {
auto col_ctx = buildCollisionContext();
Systems::Collision::detectAll(col_ctx);
}
+6 -1
View File
@@ -28,6 +28,7 @@
#include "game/entities/ship.hpp"
#include "game/stage_system/stage_config.hpp"
#include "game/stage_system/stage_manager.hpp"
#include "game/systems/collision_system.hpp"
// Game over state machine
enum class GameOverState : uint8_t {
@@ -67,7 +68,7 @@ class GameScene final : public Scene {
std::array<Enemy, Constants::MAX_ORNIS> enemies_;
// 6 balas: P1=[0,1,2], P2=[3,4,5]. El cast a size_t evita la
// widening conversion implícita que detecta clang-tidy.
std::array<Bullet, static_cast<std::size_t>(Constants::MAX_BULLETS) * 2> bullets_;
std::array<Bullet, static_cast<std::size_t>(Defaults::Entities::MAX_BULLETS_TOTAL)> bullets_;
std::array<float, 2> hit_timer_per_player_; // Death timers per player (seconds)
// Lives and game over system
@@ -144,6 +145,10 @@ class GameScene final : public Scene {
void runStageLevelStart(float delta_time);
void runStagePlaying(float delta_time);
void runStageLevelCompleted(float delta_time);
// Construeix el Collision::Context del frame actual (referències a tots els
// pools/managers + on_player_hit). Reutilitzat tant per al tick d'IA com
// per a runCollisionDetections.
[[nodiscard]] auto buildCollisionContext() -> Systems::Collision::Context;
// Helper: ejecuta colisiones de gameplay con el Context preparado.
void runCollisionDetections();
};