1
0
Fork 0
tetris-go/game/line_clear_animation.go

57 lines
1.2 KiB
Go

package game
// LineClearAnimation clears completed lines cell-by-cell to create
// a visual wipe effect from the center outward.
//
// Once the lines are cleared, the remaining lines are moved down.
type LineClearAnimation struct {
// lines to clear.
lines []byte
// next index to clear to the left
leftIndex int8
// next index to clear to the right
rightIndex int8
}
func (lca *LineClearAnimation) Reset() {
lca.lines = []byte{}
}
func (lca LineClearAnimation) NumLines() int {
return len(lca.lines)
}
func (lca *LineClearAnimation) SetLines(rows []byte) {
lca.lines = rows
lca.leftIndex = (GRID_WIDTH - 1) / 2
if (GRID_WIDTH-1)%2 != 0 {
lca.rightIndex = lca.leftIndex + 1
} else {
lca.rightIndex = lca.leftIndex
}
}
func (lca *LineClearAnimation) Update(grid *Grid) {
if lca.Completed() {
return
}
if lca.leftIndex < 0 || lca.rightIndex > GRID_WIDTH {
grid.MoveLinesDown(lca.lines...)
lca.Reset()
return
}
for _, lineIndex := range lca.lines {
grid.Set(byte(lca.leftIndex), lineIndex, BLOCK_EMPTY)
grid.Set(byte(lca.rightIndex), lineIndex, BLOCK_EMPTY)
}
lca.leftIndex--
lca.rightIndex++
}
func (lca LineClearAnimation) Completed() bool {
return lca.NumLines() == 0
}