refactor(shapes): reorganitzar data/shapes en subcarpetes per categoria (enemy/bullet/ship/effect)

This commit is contained in:
2026-05-26 18:25:15 +02:00
parent 164f58c883
commit 61a4886e62
30 changed files with 51 additions and 53 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ name: bullet
# Shape de la bala. El bounding_radius del .shp dóna el hitbox base (~3 px); # Shape de la bala. El bounding_radius del .shp dóna el hitbox base (~3 px);
# scale el modula visualment i pel hitbox. # scale el modula visualment i pel hitbox.
shape: shape:
path: bullet.shp path: bullet/basic.shp
scale: 1.0 scale: 1.0
collision_factor: 1.0 collision_factor: 1.0
+1 -1
View File
@@ -4,7 +4,7 @@ name: bullet_long
# jugador i amb prou marge per reaccionar. La velocitat NO viu aquí: es passa # jugador i amb prou marge per reaccionar. La velocitat NO viu aquí: es passa
# a Bullet::fire() i la decideix qui dispara (l'AiTickAction). # a Bullet::fire() i la decideix qui dispara (l'AiTickAction).
shape: shape:
path: bullet_long.shp path: bullet/long.shp
scale: 1.0 scale: 1.0
collision_factor: 0.5 collision_factor: 0.5
+1 -1
View File
@@ -5,7 +5,7 @@ ai_type: orb # Validat contra el directori; mapeja a EnemyType::O
# pensada per llegir-se com a "reactor / orb" amb més detall que els enemics # pensada per llegir-se com a "reactor / orb" amb més detall que els enemics
# petits. # petits.
shape: shape:
path: enemy_orb.shp path: enemy/orb.shp
scale: 1.0 scale: 1.0
collision_factor: 1.0 collision_factor: 1.0
+1 -1
View File
@@ -2,7 +2,7 @@ name: pentagon
ai_type: pentagon # Validat contra el directori; mapeja a EnemyType::PENTAGON. ai_type: pentagon # Validat contra el directori; mapeja a EnemyType::PENTAGON.
shape: shape:
path: enemy_pentagon.shp path: enemy/pentagon.shp
scale: 1.0 # multiplicador visual + hitbox sobre la mida nativa del .shp scale: 1.0 # multiplicador visual + hitbox sobre la mida nativa del .shp
collision_factor: 1.0 # ajust opcional del hitbox (default 1.0) collision_factor: 1.0 # ajust opcional del hitbox (default 1.0)
+1 -1
View File
@@ -2,7 +2,7 @@ name: pinwheel
ai_type: pinwheel # Validat contra el directori; mapeja a EnemyType::PINWHEEL. ai_type: pinwheel # Validat contra el directori; mapeja a EnemyType::PINWHEEL.
shape: shape:
path: enemy_pinwheel.shp path: enemy/pinwheel.shp
scale: 1.0 # multiplicador visual + hitbox sobre la mida nativa del .shp scale: 1.0 # multiplicador visual + hitbox sobre la mida nativa del .shp
collision_factor: 1.0 # ajust opcional del hitbox (default 1.0) collision_factor: 1.0 # ajust opcional del hitbox (default 1.0)
+2 -2
View File
@@ -1,7 +1,7 @@
name: player_ship name: player_ship
# Shape de la nau. Resolt per ShapeLoader (busca a "shapes/<path>"). # Shape de la nau. Resolt per ShapeLoader (busca a "shapes/<path>").
# Nota: el segon jugador rep un override del shape ("ship2.shp") al ctor. # Nota: el segon jugador rep un override del shape ("ship/wedge.shp") al ctor.
# Quan s'introdueixin variants reals de nau, es crearà un YAML separat # Quan s'introdueixin variants reals de nau, es crearà un YAML separat
# per cada model. # per cada model.
# #
@@ -10,7 +10,7 @@ name: player_ship
# automàtic de la shape; tocar només si el feel del hitbox # automàtic de la shape; tocar només si el feel del hitbox
# no quadra amb la silueta visual (default 1.0). # no quadra amb la silueta visual (default 1.0).
shape: shape:
path: ship.shp path: ship/arrow.shp
scale: 1.0 scale: 1.0
collision_factor: 1.0 collision_factor: 1.0
+1 -1
View File
@@ -2,7 +2,7 @@ name: square
ai_type: square # Validat contra el directori; mapeja a EnemyType::SQUARE. ai_type: square # Validat contra el directori; mapeja a EnemyType::SQUARE.
shape: shape:
path: enemy_square.shp path: enemy/square.shp
scale: 1.0 # multiplicador visual + hitbox sobre la mida nativa del .shp scale: 1.0 # multiplicador visual + hitbox sobre la mida nativa del .shp
collision_factor: 1.0 # ajust opcional del hitbox (default 1.0) collision_factor: 1.0 # ajust opcional del hitbox (default 1.0)
+1 -1
View File
@@ -2,7 +2,7 @@ name: star
ai_type: star # Validat contra el directori; mapeja a EnemyType::STAR. ai_type: star # Validat contra el directori; mapeja a EnemyType::STAR.
shape: shape:
path: star_5.shp path: enemy/star.shp
scale: 0.7 # Lleugerament més petit que els altres enemics per diferenciar visualment. scale: 0.7 # Lleugerament més petit que els altres enemics per diferenciar visualment.
collision_factor: 1.0 collision_factor: 1.0
@@ -1,6 +1,6 @@
# bullet.shp - Projectil (octàgon, radi=3) # bullet/basic.shp - Projectil (octàgon, radi=3)
name: bullet name: basic
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,4 +1,4 @@
# bullet_double.shp - Bala anular (dos cercles concèntrics) # bullet/double.shp - Bala anular (dos cercles concèntrics)
# © 2026 JailDesigner # © 2026 JailDesigner
# #
# Dos octàgons concèntrics al centre (0,0): # Dos octàgons concèntrics al centre (0,0):
@@ -6,7 +6,7 @@
# - Interior: radi 2 (lleugerament més petit que la bala estàndard) # - Interior: radi 2 (lleugerament més petit que la bala estàndard)
# Aspecte d'anell / aura de plasma. Bounding radius natiu = 4. # Aspecte d'anell / aura de plasma. Bounding radius natiu = 4.
name: bullet_double name: double
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,4 +1,4 @@
# bullet_long.shp - Bala allargada vertical (dos mig-octàgons + dos costats) # bullet/long.shp - Bala allargada vertical (dos mig-octàgons + dos costats)
# © 2026 JailDesigner # © 2026 JailDesigner
# #
# Càpsula orientada al llarg de l'eix Y: la bala viatja segons el seu angle # Càpsula orientada al llarg de l'eix Y: la bala viatja segons el seu angle
@@ -15,7 +15,7 @@
# Bounding radius natiu = 6 (extrem vertical a y=±6). # Bounding radius natiu = 6 (extrem vertical a y=±6).
# collision_factor al YAML compensa el bounding doble (0.5 → hitbox ≈ 3). # collision_factor al YAML compensa el bounding doble (0.5 → hitbox ≈ 3).
name: bullet_long name: long
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,7 +1,7 @@
# star.shp - Estrella per a starfield # effect/starfield.shp - Estrella per a starfield
# © 2026 JailDesigner # © 2026 JailDesigner
name: star name: starfield
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,4 +1,4 @@
# title_flash.shp - Sparkle 4-puntes amb costats còncaus (Atari-style) # effect/title_flash.shp - Sparkle 4-puntes amb costats còncaus (Atari-style)
# 4 puntes als cardinals (radi 30) i valls còncaus als 45° (corba Bezier # 4 puntes als cardinals (radi 30) i valls còncaus als 45° (corba Bezier
# quadràtica amb control point ±8). 5 punts per arc subdividint la corba. # quadràtica amb control point ±8). 5 punts per arc subdividint la corba.
@@ -1,4 +1,4 @@
# enemy_orb.shp - ORNI enemic gegant (orb circular, doble anell amb radis) # enemy/orb.shp - ORNI enemic gegant (orb circular, doble anell amb radis)
# © 2026 JailDesigner # © 2026 JailDesigner
# #
# Forma "reactor / boss circular" — més detall que els enemics petits perquè # Forma "reactor / boss circular" — més detall que els enemics petits perquè
@@ -9,7 +9,7 @@
# - Petit "+" central com a nucli. # - Petit "+" central com a nucli.
# Bounding radius natiu = 20 (alineat amb la resta d'enemics). # Bounding radius natiu = 20 (alineat amb la resta d'enemics).
name: enemy_orb name: orb
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,6 +1,6 @@
# enemy_pentagon.shp - ORNI enemic (pentàgon doble concentric, radi exterior=20) # enemy/pentagon.shp - ORNI enemic (pentàgon doble concentric, radi exterior=20)
name: enemy_pentagon name: pentagon
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,7 +1,7 @@
# enemy_pinwheel.shp - ORNI enemic (molinillo de 4 triangles) # enemy/pinwheel.shp - ORNI enemic (molinillo de 4 triangles)
# © 2026 JailDesigner # © 2026 JailDesigner
name: enemy_pinwheel name: pinwheel
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,6 +1,6 @@
# enemy_square.shp - ORNI enemic (rombe, radi=20) + ull amb pupil·la al centre # enemy/square.shp - ORNI enemic (rombe, radi=20) + ull amb pupil·la al centre
name: enemy_square name: square
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,4 +1,4 @@
# star_5.shp - ORNI enemic (estrella de 5 puntes, només perímetre) # enemy/star.shp - ORNI enemic (estrella de 5 puntes, només perímetre)
# © 2026 JailDesigner # © 2026 JailDesigner
# #
# Pentagrama clàssic: 5 vèrtexs exteriors (radi 20) alternant amb 5 vèrtexs # Pentagrama clàssic: 5 vèrtexs exteriors (radi 20) alternant amb 5 vèrtexs
@@ -8,7 +8,7 @@
# Sense línies interiors: una única polyline que recorre el perímetre. # Sense línies interiors: una única polyline que recorre el perímetre.
# Bounding radius natiu ≈ 20 (alineat amb pentagon/square/pinwheel). # Bounding radius natiu ≈ 20 (alineat amb pentagon/square/pinwheel).
name: star_5 name: star
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
-8
View File
@@ -1,8 +0,0 @@
# ship.shp - Nau del jugador 1
# Triangle amb base còncava (punta de fletxa)
name: ship
scale: 1.0
center: 0, 0
polyline: 0,-12 8.49,8.49 0,4 -8.49,8.49 0,-12
+7
View File
@@ -0,0 +1,7 @@
# ship/arrow.shp - Nau del jugador 1 (triangle amb base còncava, punta de fletxa)
name: arrow
scale: 1.0
center: 0, 0
polyline: 0,-12 8.49,8.49 0,4 -8.49,8.49 0,-12
@@ -1,7 +1,7 @@
# ship2.shp - Nau del jugador 2 (interceptor amb ales) # ship/interceptor.shp - Interceptor amb ales laterals pronunciades
# © 2026 JailDesigner # © 2026 JailDesigner
name: ship2 name: interceptor
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
@@ -1,7 +1,6 @@
# ship2.shp - Nau del jugador 2 # ship/wedge.shp - Nau del jugador 2 (triangle amb cercle central)
# Triangle amb cercle central (distintiu visual)
name: ship2 name: wedge
scale: 1.0 scale: 1.0
center: 0, 0 center: 0, 0
+1 -1
View File
@@ -20,7 +20,7 @@ namespace Graphics {
return it->second; // Cache hit return it->second; // Cache hit
} }
// Normalize path: "ship.shp" → "shapes/ship.shp" // Normalize path: "ship/arrow.shp" → "shapes/ship/arrow.shp"
// "logo/letra_j.shp" → "shapes/logo/letra_j.shp" // "logo/letra_j.shp" → "shapes/logo/letra_j.shp"
std::string normalized = filename; std::string normalized = filename;
if (!normalized.starts_with("shapes/")) { if (!normalized.starts_with("shapes/")) {
+1 -1
View File
@@ -19,7 +19,7 @@ namespace Graphics {
// Carregar shape desde file (con caché) // Carregar shape desde file (con caché)
// Retorna punter compartit (nullptr si error) // Retorna punter compartit (nullptr si error)
// Exemple: load("ship.shp") → busca a "data/shapes/ship.shp" // Exemple: load("ship/arrow.shp") → busca a "data/shapes/ship/arrow.shp"
static auto load(const std::string& filename) -> std::shared_ptr<Shape>; static auto load(const std::string& filename) -> std::shared_ptr<Shape>;
// Netejar caché (útil per debug/recàrrega) // Netejar caché (útil per debug/recàrrega)
+2 -2
View File
@@ -33,9 +33,9 @@ namespace Effects {
TrailManager::TrailManager(Rendering::Renderer* renderer) TrailManager::TrailManager(Rendering::Renderer* renderer)
: renderer_(renderer), : renderer_(renderer),
star_shape_(Graphics::ShapeLoader::load("star.shp")) { star_shape_(Graphics::ShapeLoader::load("effect/starfield.shp")) {
if (!star_shape_ || !star_shape_->isValid()) { if (!star_shape_ || !star_shape_->isValid()) {
std::cerr << "[TrailManager] Warning: no s'ha pogut load star.shp\n"; std::cerr << "[TrailManager] Warning: no s'ha pogut load effect/starfield.shp\n";
} }
for (auto& particle : pool_) { for (auto& particle : pool_) {
particle.active = false; particle.active = false;
+1 -1
View File
@@ -26,7 +26,7 @@ Ship::Ship(Rendering::Renderer* renderer, PlayerConfig config, const char* shape
config_(std::move(config)) { config_(std::move(config)) {
brightness_ = Defaults::Brightness::NAU; brightness_ = Defaults::Brightness::NAU;
// El shape pot venir del YAML o ser overridden (ex: P2 amb "ship2.shp"). // El shape pot venir del YAML o ser overridden (ex: P2 amb "ship/wedge.shp").
const std::string SHAPE_PATH = (shape_override != nullptr) ? shape_override : config_.shape.path; const std::string SHAPE_PATH = (shape_override != nullptr) ? shape_override : config_.shape.path;
shape_ = Graphics::ShapeLoader::load(SHAPE_PATH); shape_ = Graphics::ShapeLoader::load(SHAPE_PATH);
if (!shape_ || !shape_->isValid()) { if (!shape_ || !shape_->isValid()) {
+1 -1
View File
@@ -83,7 +83,7 @@ GameScene::GameScene(SDLManager& sdl, SceneContext& context)
// Inicialitzar naves: P1 amb el shape del YAML, P2 amb override visual. // Inicialitzar naves: P1 amb el shape del YAML, P2 amb override visual.
ships_[0] = Ship(sdl.getRenderer(), *player_config); // Jugador 1: nau estàndard ships_[0] = Ship(sdl.getRenderer(), *player_config); // Jugador 1: nau estàndard
ships_[1] = Ship(sdl.getRenderer(), *player_config, "ship2.shp"); // Jugador 2: interceptor amb ales ships_[1] = Ship(sdl.getRenderer(), *player_config, "ship/wedge.shp"); // Jugador 2: triangle amb cercle central
// Inicialitzar balas con renderer // Inicialitzar balas con renderer
std::ranges::fill(bullets_, Bullet(sdl.getRenderer())); std::ranges::fill(bullets_, Bullet(sdl.getRenderer()));
+1 -1
View File
@@ -78,7 +78,7 @@ TitleScene::TitleScene(SDLManager& sdl, SceneContext& context)
// Flash que tapa el "pop" final de la nau al VP. Es spawneja al centre // Flash que tapa el "pop" final de la nau al VP. Es spawneja al centre
// de pantalla (= projecció del VP) quan ship_animator avisa. // de pantalla (= projecció del VP) quan ship_animator avisa.
flash_shape_ = Graphics::ShapeLoader::load("title_flash.shp"); flash_shape_ = Graphics::ShapeLoader::load("effect/title_flash.shp");
ship_animator_->setOnShipDisappear([this](int /*player_id*/) { ship_animator_->setOnShipDisappear([this](int /*player_id*/) {
triggerFlash(Vec2{ triggerFlash(Vec2{
.x = static_cast<float>(Defaults::Window::WIDTH) / 2.0F, .x = static_cast<float>(Defaults::Window::WIDTH) / 2.0F,
+2 -2
View File
@@ -114,8 +114,8 @@ namespace Title {
} }
void ShipAnimator::init() { void ShipAnimator::init() {
auto shape_p1 = Graphics::ShapeLoader::load("ship.shp"); auto shape_p1 = Graphics::ShapeLoader::load("ship/arrow.shp");
auto shape_p2 = Graphics::ShapeLoader::load("ship2.shp"); auto shape_p2 = Graphics::ShapeLoader::load("ship/wedge.shp");
ships_[0].player_id = 1; ships_[0].player_id = 1;
if (shape_p1 && shape_p1->isValid()) { if (shape_p1 && shape_p1->isValid()) {
+2 -2
View File
@@ -3,8 +3,8 @@
// //
// Manté la mateixa màquina d'estats // Manté la mateixa màquina d'estats
// (ENTERING → FLOATING → EXITING) però treballa amb posicions Vec3 i emet // (ENTERING → FLOATING → EXITING) però treballa amb posicions Vec3 i emet
// wireframes a través d'una `Camera3D`. La geometria s'extrau de `ship.shp` // wireframes a través d'una `Camera3D`. La geometria s'extrau de
// (P1) i `ship2.shp` (P2) per extrusió en Z. // `ship/arrow.shp` (P1) i `ship/wedge.shp` (P2) per extrusió en Z.
#pragma once #pragma once