Files
orni_attack/source/game/entities/bala.cpp
2025-11-28 08:17:12 +01:00

84 lines
2.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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 <cmath>
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;
}
}