Line drop by pixel
This commit is contained in:
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user