restaurada funcionalitat de disparar

This commit is contained in:
2025-12-02 13:09:34 +01:00
parent df744338f1
commit 76a91b4736
2 changed files with 39 additions and 21 deletions

View File

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

14
todo.txt Normal file
View File

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