From 76a91b4736872df8ad90c6888305187176e8ff88 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 2 Dec 2025 13:09:34 +0100 Subject: [PATCH] restaurada funcionalitat de disparar --- source/game/escenes/escena_joc.cpp | 46 ++++++++++++++++-------------- todo.txt | 14 +++++++++ 2 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 todo.txt diff --git a/source/game/escenes/escena_joc.cpp b/source/game/escenes/escena_joc.cpp index bdff059..4e1487e 100644 --- a/source/game/escenes/escena_joc.cpp +++ b/source/game/escenes/escena_joc.cpp @@ -162,32 +162,36 @@ void EscenaJoc::processar_input(const SDL_Event& event) { if (event.type == SDL_EVENT_KEY_DOWN) { switch (event.key.key) { case SDLK_SPACE: { - // TEMPORAL: Explotar enemic aleatori (per testing) - // TODO: Restaurar dispars quan el sistema d'explosions estiga validat - - // Buscar tots els enemics actius - std::vector enemics_actius; - for (int i = 0; i < Constants::MAX_ORNIS; i++) { - if (orni_[i].esta_actiu()) { - enemics_actius.push_back(i); - } + // No disparar si la nau està morta + if (!nau_.esta_viva()) { + break; } - if (!enemics_actius.empty()) { - // Seleccionar enemic aleatori - int idx = enemics_actius[std::rand() % enemics_actius.size()]; + // Disparar bala des del front de la nau + // El ship.shp té el front a (0, -12) en coordenades locals - // Crear explosió - debris_manager_.explotar(orni_[idx].get_forma(), - orni_[idx].get_centre(), - 0.0f, // angle (enemics no roten físicament) - 1.0f, // escala - Defaults::Physics::Debris::VELOCITAT_BASE); + // 1. Calcular posició del front de la nau + constexpr float LOCAL_TIP_X = 0.0f; + constexpr float LOCAL_TIP_Y = -12.0f; - // Desactivar enemic - orni_[idx].destruir(); + const Punt& ship_centre = nau_.get_centre(); + float ship_angle = nau_.get_angle(); - std::cout << "[TEST] Enemic " << idx << " explotat!\n"; + // Aplicar transformació: rotació + trasllació + float cos_a = std::cos(ship_angle); + float sin_a = std::sin(ship_angle); + + float tip_x = LOCAL_TIP_X * cos_a - LOCAL_TIP_Y * sin_a + ship_centre.x; + float tip_y = LOCAL_TIP_X * sin_a + LOCAL_TIP_Y * cos_a + ship_centre.y; + + Punt posicio_dispar = {tip_x, tip_y}; + + // 2. Buscar primera bala inactiva i disparar + for (auto& bala : bales_) { + if (!bala.esta_activa()) { + bala.disparar(posicio_dispar, ship_angle); + break; // Només una bala per polsació + } } break; } diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..e86d1cd --- /dev/null +++ b/todo.txt @@ -0,0 +1,14 @@ +ORNI TODO: +- Crear escena titulo: muestra el logo, el copyright, el texto de insert coin o press start y quizas un starfield de fondo +- Revisar contador de frames: hace cosas raras, hacer que se actualice cada segundo +- Añadir clase audio -> añadir ruidos a logo, title y game +- Añadir resource.pack +- Crear estados en GAME: GET_READY -> GAME -> GAME_OVER -> CONTINUE + -> STAGE_COMPLETED -> GET_READY (next stage) +- Añadir nuevos enemigos: cuadrado, ... otras formas (revisar Geometry Wars). Darles fiferente personalidad +- La bala ha de salir de la punta de la nave, con forma cuadrada, va rotando +- Pensar si todas las entidades deberian tener dos radios de colision: uno pequeño para colision con bordes o jugador, uno mas grande para colision con balas +- Revisar que los debris salgan realmente en direccion contraria al centro de la figura +- Crear progresion: fichero con enemigos para ese nivel. cuando se acaba la lista de niveles -> loop con dificultad aumentada. Pensar si jefe final. Juego no tiene fin +- Menu de servicio? numero de vidas, numero de continues o free play, controles de audio, controles de video, colores, activar parpadeo o cambiar frecuencia +- Cuando se destruye un enemigo, salen dos mas pequeños