// bala.cpp - Implementació de projectils de la nau // © 1999 Visente i Sergi (versió Pascal) // © 2025 Port a C++20 amb SDL3 #include "game/entities/bala.hpp" #include "core/rendering/polygon_renderer.hpp" #include "core/rendering/primitives.hpp" #include "game/constants.hpp" #include Bala::Bala(SDL_Renderer *renderer) : renderer_(renderer) {} void Bala::inicialitzar() { // Inicialitzar bala com a pentàgon petit // Basat en el codi Pascal original: inicialment inactiva // Copiat de joc_asteroides.cpp línies 58-64 // Crear pentàgon petit (5 costats, radi 5) crear_poligon_regular(dades_, 5, 5.0f); // Inicialment inactiva dades_.esta = false; } void Bala::disparar(const Punt &posicio, float angle) { // Activar bala i posicionar-la a la nau // Basat en joc_asteroides.cpp línies 188-200 // Activar bala dades_.esta = true; // Posició inicial = centre de la nau dades_.centre.x = posicio.x; dades_.centre.y = posicio.y; // Angle = angle de la nau (dispara en la direcció que apunta) dades_.angle = angle; // Velocitat alta (el joc Pascal original usava 7 px/frame) // 7 px/frame × 20 FPS = 140 px/s dades_.velocitat = 140.0f; } void Bala::actualitzar(float delta_time) { if (dades_.esta) { mou(delta_time); } } void Bala::dibuixar() const { if (dades_.esta) { // Dibuixar com a pentàgon petit, sense rotació visual Rendering::rota_pol(renderer_, dades_, 0.0f, true); } } void Bala::mou(float delta_time) { // Moviment rectilini de la bala // Basat en el codi Pascal original: procedure mou_bales // Copiat EXACTAMENT de joc_asteroides.cpp línies 396-419 // Calcular nova posició (moviment polar time-based) // velocitat ja està en px/s (140 px/s), només cal multiplicar per delta_time float velocitat_efectiva = dades_.velocitat * delta_time; // Calcular desplaçament (angle-PI/2 perquè angle=0 apunta amunt) float dy = velocitat_efectiva * std::sin(dades_.angle - Constants::PI / 2.0f); float dx = velocitat_efectiva * std::cos(dades_.angle - Constants::PI / 2.0f); // Acumulació directa amb precisió subpíxel dades_.centre.y += dy; dades_.centre.x += dx; // Desactivar si surt dels marges (no rebota com els ORNIs) if (dades_.centre.x < Constants::MARGE_ESQ || dades_.centre.x > Constants::MARGE_DRET || dades_.centre.y < Constants::MARGE_DALT || dades_.centre.y > Constants::MARGE_BAIX) { dades_.esta = false; } }