115 lines
2.7 KiB
C++
115 lines
2.7 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), text_(renderer) {
|
|
// 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();
|
|
}
|
|
|
|
// [PRUEBA] Text vectorial
|
|
text_.render("0123456789", {10, 10}, 1.5f);
|
|
text_.render("SCORE: 1234", {10, 40}, 1.0f);
|
|
text_.render("10:45", {10, 70}, 2.0f);
|
|
text_.render("LEVEL-3", {10, 110}, 1.5f);
|
|
|
|
// 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
|
|
}
|