Files
orni_attack/source/game/joc_asteroides.cpp
2025-11-28 12:29:56 +01:00

109 lines
2.5 KiB
C++

// joc_asteroides.cpp - Implementació de la lògica del joc
// © 1999 Visente i Sergi (versió Pascal)
// © 2025 Port a C++20 amb SDL3
#include "joc_asteroides.hpp"
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
JocAsteroides::JocAsteroides(SDL_Renderer *renderer)
: renderer_(renderer), nau_(renderer), itocado_(0) {
// Inicialitzar bales amb renderer
for (auto &bala : bales_) {
bala = Bala(renderer);
}
// Inicialitzar enemics amb renderer
for (auto &enemy : orni_) {
enemy = Enemic(renderer);
}
}
void JocAsteroides::inicialitzar() {
// Inicialitzar generador de números aleatoris
// Basat en el codi Pascal original: line 376
std::srand(static_cast<unsigned>(std::time(nullptr)));
// Inicialitzar estat de col·lisió
itocado_ = 0;
// Inicialitzar nau
nau_.inicialitzar();
// Inicialitzar enemics (ORNIs)
for (auto &enemy : orni_) {
enemy.inicialitzar();
}
// Inicialitzar bales
for (auto &bala : bales_) {
bala.inicialitzar();
}
}
void JocAsteroides::actualitzar(float delta_time) {
// Actualitzar nau (input + física)
nau_.processar_input(delta_time);
nau_.actualitzar(delta_time);
// Actualitzar moviment i rotació dels enemics (ORNIs)
for (auto &enemy : orni_) {
enemy.actualitzar(delta_time);
}
// Actualitzar moviment de bales (Fase 9)
for (auto &bala : bales_) {
bala.actualitzar(delta_time);
}
}
void JocAsteroides::dibuixar() {
// Dibuixar nau
nau_.dibuixar();
// Dibuixar ORNIs (enemics)
for (const auto &enemy : orni_) {
enemy.dibuixar();
}
// Dibuixar bales (Fase 9)
for (const auto &bala : bales_) {
bala.dibuixar();
}
// TODO: Dibuixar marges (Fase 11)
}
void JocAsteroides::processar_input(const SDL_Event &event) {
// Processament d'input per events puntuals (no continus)
// L'input continu (fletxes) es processa en actualitzar() amb
// SDL_GetKeyboardState()
if (event.type == SDL_EVENT_KEY_DOWN) {
switch (event.key.key) {
case SDLK_SPACE:
// Disparar (Fase 9)
// Basat en el codi Pascal original: crear bala en posició de la nau
// El joc original només permetia 1 bala activa alhora
// Buscar primera bala inactiva
for (auto &bala : bales_) {
if (!bala.esta_activa()) {
bala.disparar(nau_.get_centre(), nau_.get_angle());
break;
}
}
break;
default:
break;
}
}
}
void JocAsteroides::tocado() {
// TODO: Implementar seqüència de mort
}