// 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 #include #include #include 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(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 }