separació per entitats
This commit is contained in:
83
source/game/entities/bala.cpp
Normal file
83
source/game/entities/bala.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user