migrat a sistema de shapes

This commit is contained in:
2025-11-28 12:29:56 +01:00
parent 06e9a10c98
commit 4d0a5ca5bd
13 changed files with 246 additions and 115 deletions

View File

@@ -3,23 +3,30 @@
// © 2025 Port a C++20 amb SDL3
#include "game/entities/bala.hpp"
#include "core/rendering/polygon_renderer.hpp"
#include "core/rendering/primitives.hpp"
#include "core/graphics/shape_loader.hpp"
#include "core/rendering/shape_renderer.hpp"
#include "game/constants.hpp"
#include <cmath>
#include <iostream>
Bala::Bala(SDL_Renderer *renderer) : renderer_(renderer) {}
Bala::Bala(SDL_Renderer *renderer)
: renderer_(renderer), centre_({0.0f, 0.0f}), angle_(0.0f),
velocitat_(0.0f), esta_(false) {
// [NUEVO] Carregar forma compartida des de fitxer
forma_ = Graphics::ShapeLoader::load("bullet.shp");
if (!forma_ || !forma_->es_valida()) {
std::cerr << "[Bala] Error: no s'ha pogut carregar bullet.shp" << std::endl;
}
}
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;
esta_ = false;
centre_ = {0.0f, 0.0f};
angle_ = 0.0f;
velocitat_ = 0.0f;
}
void Bala::disparar(const Punt &posicio, float angle) {
@@ -27,30 +34,31 @@ void Bala::disparar(const Punt &posicio, float angle) {
// Basat en joc_asteroides.cpp línies 188-200
// Activar bala
dades_.esta = true;
esta_ = true;
// Posició inicial = centre de la nau
dades_.centre.x = posicio.x;
dades_.centre.y = posicio.y;
centre_.x = posicio.x;
centre_.y = posicio.y;
// Angle = angle de la nau (dispara en la direcció que apunta)
dades_.angle = angle;
angle_ = angle;
// Velocitat alta (el joc Pascal original usava 7 px/frame)
// 7 px/frame × 20 FPS = 140 px/s
dades_.velocitat = 140.0f;
velocitat_ = 140.0f;
}
void Bala::actualitzar(float delta_time) {
if (dades_.esta) {
if (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);
if (esta_ && forma_) {
// [NUEVO] Usar render_shape en lloc de rota_pol
// Les bales no roten visualment (angle sempre 0.0f)
Rendering::render_shape(renderer_, forma_, centre_, 0.0f, 1.0f, true);
}
}
@@ -61,23 +69,19 @@ void Bala::mou(float delta_time) {
// 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;
float velocitat_efectiva = 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);
float dy = velocitat_efectiva * std::sin(angle_ - Constants::PI / 2.0f);
float dx = velocitat_efectiva * std::cos(angle_ - Constants::PI / 2.0f);
// Acumulació directa amb precisió subpíxel
dades_.centre.y += dy;
dades_.centre.x += dx;
centre_.y += dy;
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;
if (centre_.x < Constants::MARGE_ESQ || centre_.x > Constants::MARGE_DRET ||
centre_.y < Constants::MARGE_DALT || centre_.y > Constants::MARGE_BAIX) {
esta_ = false;
}
}