From 59680ce7c0b3ac9d2769ff98ef78549b29680c54 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 28 Jul 2024 12:46:26 +0200 Subject: [PATCH] afegida la classe Explosions --- source/explosions.cpp | 59 ++++++++++++++++++++++++++++++++++++++++--- source/explosions.h | 27 ++++++++++---------- source/game.cpp | 5 ++++ 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/source/explosions.cpp b/source/explosions.cpp index 244605f..77baf8f 100644 --- a/source/explosions.cpp +++ b/source/explosions.cpp @@ -12,28 +12,79 @@ Explosions::~Explosions() { for (auto explosion : explosions) { + if (explosion) + { + delete explosion; + } } } // Actualiza la lógica de la clase void Explosions::update() { + for (auto explosion : explosions) + { + explosion->update(); + } + + // Vacia el vector de elementos finalizados + freeExplosions(); } // Dibuja el objeto en pantalla void Explosions::render() { + for (auto explosion : explosions) + { + explosion->render(); + } } // Añade texturas al objetp -void Explosions::addTexture(Texture *texture) +void Explosions::addTexture(int size, Texture *texture, std::vector *animation) { - textures.push_back(texture); + explosion_texture_t temp; + temp.size = size; + temp.texture = texture; + temp.animation = animation; + textures.push_back(temp); } // Añade una explosión void Explosions::add(int x, int y, int size) { - AnimatedSprite *sprite = new AnimatedSprite(textures[0]); - sprite->setPos({x,y}); + const int index = getIndexBySize(size); + AnimatedSprite *sprite = new AnimatedSprite(textures[index].texture, "", textures[index].animation); + sprite->setPos({x, y}); + explosions.push_back(sprite); +} + +// Vacia el vector de elementos finalizados +void Explosions::freeExplosions() +{ + if (explosions.empty() == false) + { + for (int i = explosions.size() - 1; i >= 0; --i) + { + if (explosions[i]->animationIsCompleted()) + { + delete explosions[i]; + explosions.erase(explosions.begin() + i); + } + } + } +} + +// Busca una textura a partir del tamaño +int Explosions::getIndexBySize(int size) +{ + for (int i = 0; i < (int)textures.size();++i) + { + if (size == textures[i].size) + { + return i; + } + } + + return 0; } \ No newline at end of file diff --git a/source/explosions.h b/source/explosions.h index 2d80c20..83eef83 100644 --- a/source/explosions.h +++ b/source/explosions.h @@ -5,27 +5,26 @@ #include "common/animatedsprite.h" #include -struct explosion_t +struct explosion_texture_t { - AnimatedSprite *sprite; // Sprite para dibujar la explosión - bool ended; // Indica si la explosión ha terminado -}; - -struct explision_texture_t -{ - Texture *texture; // Textura para la explosión - int size; // Tamaño de la explosión + Texture *texture; // Textura para la explosión + std::vector *animation; // Animación para la textura + int size; // Tamaño de la explosión }; // Clase explosions class Explosions { private: - // Objetos y punteros - // Variables - std::vector textures; // Vector con las texturas a utilizar - std::vector explosions; // Lista con todas las explosiones + std::vector textures; // Vector con las texturas a utilizar + std::vector explosions; // Lista con todas las explosiones + + // Vacia el vector de elementos finalizados + void freeExplosions(); + + // Busca una textura a partir del tamaño + int getIndexBySize(int size); public: // Constructor @@ -41,7 +40,7 @@ public: void render(); // Añade texturas al objetp - void addTexture(Texture *texture); + void addTexture(int size, Texture *texture, std::vector *animation); // Añade una explosión void add(int x, int y, int size); diff --git a/source/game.cpp b/source/game.cpp index 49206f2..43f0b97 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -49,6 +49,11 @@ Game::Game(int playerID, int currentStage, SDL_Renderer *renderer, Screen *scree n2500Sprite = new SmartSprite(gameTextTexture); n5000Sprite = new SmartSprite(gameTextTexture); + explosions->addTexture(1, explosionsTextures[0], explosionsAnimations[0]); + explosions->addTexture(2, explosionsTextures[1], explosionsAnimations[1]); + explosions->addTexture(3, explosionsTextures[2], explosionsAnimations[2]); + explosions->addTexture(4, explosionsTextures[3], explosionsAnimations[3]); + canvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, playArea.w, playArea.h); SDL_SetTextureBlendMode(canvas, SDL_BLENDMODE_BLEND);