Line drop by pixel

This commit is contained in:
2025-11-30 08:17:34 +01:00
parent 332e2efb74
commit 8279ccbe6d
3 changed files with 49 additions and 2 deletions

View File

@ -194,9 +194,28 @@ void LineEffect::startLineClear(const std::vector<int>& rows, int gridX, int gri
clearingRows = rows;
state = AnimationState::FLASH_WHITE;
timer = 0.0f;
dropProgress = 0.0f;
dropBlockSize = blockSize;
rowDropTargets.fill(0.0f);
particles.clear();
sparks.clear();
glowPulses.clear();
std::array<bool, Game::ROWS> rowClearing{};
for (int row : rows) {
if (row >= 0 && row < Game::ROWS) {
rowClearing[row] = true;
}
}
int clearedBelow = 0;
for (int row = Game::ROWS - 1; row >= 0; --row) {
if (rowClearing[row]) {
++clearedBelow;
} else if (clearedBelow > 0) {
rowDropTargets[row] = static_cast<float>(clearedBelow * blockSize);
}
}
// Create particles for each clearing row
for (int row : rows) {
@ -267,12 +286,16 @@ bool LineEffect::update(float deltaTime) {
updateParticles(deltaTime);
updateSparks(deltaTime);
updateGlowPulses(deltaTime);
dropProgress = std::min(1.0f, timer / DROP_DURATION);
if (timer >= DROP_DURATION) {
state = AnimationState::IDLE;
clearingRows.clear();
particles.clear();
sparks.clear();
glowPulses.clear();
rowDropTargets.fill(0.0f);
dropProgress = 0.0f;
dropBlockSize = 0;
return true; // Effect complete
}
break;
@ -335,6 +358,21 @@ void LineEffect::render(SDL_Renderer* renderer, SDL_Texture* blocksTex, int grid
}
}
float LineEffect::getRowDropOffset(int row) const {
if (state != AnimationState::BLOCKS_DROP) {
return 0.0f;
}
if (row < 0 || row >= Game::ROWS) {
return 0.0f;
}
float target = rowDropTargets[row];
if (target <= 0.0f) {
return 0.0f;
}
float eased = dropProgress * dropProgress * dropProgress;
return target * eased;
}
void LineEffect::renderFlash(int gridX, int gridY, int blockSize) {
// Create a flashing white effect with varying opacity
float progress = timer / FLASH_DURATION;