// LineEffect.h - Line clearing visual and audio effects #pragma once #include #include #include class LineEffect { public: struct Particle { float x, y; float vx, vy; float size; float alpha; SDL_Color color; Particle(float px, float py); void update(); void render(SDL_Renderer* renderer); bool isAlive() const { return alpha > 0.0f; } }; enum class AnimationState { IDLE, FLASH_WHITE, EXPLODE_BLOCKS, BLOCKS_DROP }; LineEffect(); ~LineEffect(); bool init(SDL_Renderer* renderer); void shutdown(); // Start line clear effect for the specified rows void startLineClear(const std::vector& rows, int gridX, int gridY, int blockSize); // Update and render the effect bool update(float deltaTime); // Returns true if effect is complete void render(SDL_Renderer* renderer, int gridX, int gridY, int blockSize); // Audio void playLineClearSound(int lineCount); bool isActive() const { return state != AnimationState::IDLE; } private: SDL_Renderer* renderer{nullptr}; AnimationState state{AnimationState::IDLE}; float timer{0.0f}; std::vector clearingRows; std::vector particles; std::mt19937 rng{std::random_device{}()}; // Audio resources SDL_AudioStream* audioStream{nullptr}; std::vector lineClearSample; std::vector tetrisSample; // Animation timing - Flash then immediate explosion effect static constexpr float FLASH_DURATION = 0.12f; // Very brief white flash static constexpr float EXPLODE_DURATION = 0.15f; // Quick explosive effect static constexpr float DROP_DURATION = 0.05f; // Almost instant block drop void createParticles(int row, int gridX, int gridY, int blockSize); void updateParticles(); void renderFlash(int gridX, int gridY, int blockSize); void renderExplosion(); bool loadAudioSample(const std::string& path, std::vector& sample); void initAudio(); };