feat(enemy): els enemics poden disparar bales via tick d'IA
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user