ae5cc1cfb4
Tots els tipus d'entitat passen del catala a l'angles seguint el
.clang-tidy del projecte (tipus en CamelCase, metodes en camelBack,
membres en lower_case amb sufix _).
Renames de tipus:
- Entitat -> Entity (core/entities/entity.hpp)
- Nau -> Ship (game/entities/ship.{hpp,cpp})
- Enemic -> Enemy (game/entities/enemy.{hpp,cpp})
- Bala -> Bullet (game/entities/bullet.{hpp,cpp})
- TipusEnemic -> EnemyType
- AnimacioEnemic -> EnemyAnimation
Metodes virtuals (s'aplica a tot el codi, no nomes a entitats):
- actualitzar -> update
- dibuixar -> draw
- inicialitzar -> init
- processar_input -> processInput
- esta_actiu -> isActive
- es_collidable -> isCollidable
- get_collision_radius -> getCollisionRadius
Getters comuns:
- get_centre -> getCenter
- get_angle -> getAngle
- get_brightness -> getBrightness
- get_forma -> getShape
Metodes especifics:
- esta_viva -> isAlive
- esta_tocada -> isHit
- es_invulnerable -> isInvulnerable
- get_velocitat_vector -> getVelocityVector
- set_centre -> setCenter
- marcar_tocada -> markHit
- aplicar_fisica -> applyPhysics
- get_tipus -> getType
Camps privats:
- centre_ -> center_
- velocitat_ -> velocity_
- forma_ -> shape_
- esta_tocada_ -> is_hit_
- tipus_ -> type_
L'import d'audio/input d'AEEA quedara coherent (mateix estil).
Diff net: 30 fitxers, +437/-437 (la majoria es renames simetrics).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
128 lines
3.6 KiB
C++
128 lines
3.6 KiB
C++
// bala.cpp - Implementació de projectils de la nau
|
||
// © 1999 Visente i Sergi (versió Pascal)
|
||
// © 2025 Port a C++20 amb SDL3
|
||
|
||
#include "game/entities/bullet.hpp"
|
||
|
||
#include <algorithm>
|
||
#include <cmath>
|
||
#include <cstdint>
|
||
#include <iostream>
|
||
|
||
#include "core/audio/audio.hpp"
|
||
#include "core/defaults.hpp"
|
||
#include "core/entities/entity.hpp"
|
||
#include "core/graphics/shape_loader.hpp"
|
||
#include "core/rendering/shape_renderer.hpp"
|
||
#include "core/types.hpp"
|
||
#include "game/constants.hpp"
|
||
|
||
Bullet::Bullet(SDL_Renderer* renderer)
|
||
: Entity(renderer),
|
||
velocity_(0.0F),
|
||
esta_(false),
|
||
owner_id_(0),
|
||
grace_timer_(0.0F) {
|
||
// [NUEVO] Brightness específic per bales
|
||
brightness_ = Defaults::Brightness::BALA;
|
||
|
||
// [NUEVO] Carregar forma compartida des de fitxer
|
||
shape_ = Graphics::ShapeLoader::load("bullet.shp");
|
||
|
||
if (!shape_ || !shape_->es_valida()) {
|
||
std::cerr << "[Bullet] Error: no s'ha pogut carregar bullet.shp" << '\n';
|
||
}
|
||
}
|
||
|
||
void Bullet::init() {
|
||
// Inicialment inactiva
|
||
esta_ = false;
|
||
center_ = {.x = 0.0F, .y = 0.0F};
|
||
angle_ = 0.0F;
|
||
velocity_ = 0.0F;
|
||
grace_timer_ = 0.0F;
|
||
}
|
||
|
||
void Bullet::disparar(const Vec2& posicio, float angle, uint8_t owner_id) {
|
||
// Activar bala i posicionar-la a la nau
|
||
// Basat en joc_asteroides.cpp línies 188-200
|
||
|
||
// Activar bala
|
||
esta_ = true;
|
||
|
||
// Posició inicial = centre de la nau
|
||
center_.x = posicio.x;
|
||
center_.y = posicio.y;
|
||
|
||
// Angle = angle de la nau (dispara en la direcció que apunta)
|
||
angle_ = angle;
|
||
|
||
// Almacenar propietario (0=P1, 1=P2)
|
||
owner_id_ = owner_id;
|
||
|
||
// Velocitat alta (el joc Pascal original usava 7 px/frame)
|
||
// 7 px/frame × 20 FPS = 140 px/s
|
||
velocity_ = 140.0F;
|
||
|
||
// Activar grace period (prevents instant self-collision)
|
||
grace_timer_ = Defaults::Game::BULLET_GRACE_PERIOD;
|
||
|
||
// Reproducir sonido de disparo láser
|
||
Audio::get()->playSound(Defaults::Sound::LASER, Audio::Group::GAME);
|
||
}
|
||
|
||
void Bullet::update(float delta_time) {
|
||
if (esta_) {
|
||
// Decrementar grace timer
|
||
if (grace_timer_ > 0.0F) {
|
||
grace_timer_ -= delta_time;
|
||
grace_timer_ = std::max(grace_timer_, 0.0F);
|
||
}
|
||
|
||
mou(delta_time);
|
||
}
|
||
}
|
||
|
||
void Bullet::draw() const {
|
||
if (esta_ && shape_) {
|
||
// [NUEVO] Usar render_shape en lloc de rota_pol
|
||
// Les bales roten segons l'angle de trajectòria
|
||
Rendering::render_shape(renderer_, shape_, center_, angle_, 1.0F, 1.0F, brightness_);
|
||
}
|
||
}
|
||
|
||
void Bullet::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 = velocity_ * delta_time;
|
||
|
||
// Calcular desplaçament (angle-PI/2 perquè angle=0 apunta amunt)
|
||
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
|
||
center_.y += dy;
|
||
center_.x += dx;
|
||
|
||
// Desactivar si surt de la zona de joc (no rebota com els ORNIs)
|
||
// CORRECCIÓ: Usar límits segurs amb radi de la bala
|
||
float min_x;
|
||
float max_x;
|
||
float min_y;
|
||
float max_y;
|
||
Constants::obtenir_limits_zona_segurs(Defaults::Entities::BULLET_RADIUS,
|
||
min_x,
|
||
max_x,
|
||
min_y,
|
||
max_y);
|
||
|
||
if (center_.x < min_x || center_.x > max_x ||
|
||
center_.y < min_y || center_.y > max_y) {
|
||
esta_ = false;
|
||
}
|
||
}
|