import { isClear } from '../../unit/' import { fillLine, blankLine } from '../../unit/const' import states from '../../control/states' const t = setTimeout export default { props: ['cur', 'reset', 'propMatrix'], watch: { $props: { handler(val = {}, oldVal) { this.propsChange(val) }, deep: true } }, render() { let matrix if (this.isOver) { matrix = this.overState } else { matrix = this.getResult() } return (
{matrix.map((p, k1) =>

{p.map((e, k2) => )}

)}
) }, data() { return { clearLines: false, animateColor: 2, isOver: false, overState: null } }, methods: { propsChange(nextProps) { const clears = isClear(nextProps.propMatrix) const overs = nextProps.reset setTimeout(() => { this.clearLines = clears this.isOver = overs }, 0) if (clears && !this.clearLines) { this.clearAnimate(clears) } if (!clears && overs && !this.isOver) { this.over(nextProps) } }, getResult(props) { if (!props) { props = this.$props } const cur = props.cur const shape = cur && cur.shape const xy = cur && cur.xy let matrix = JSON.parse(JSON.stringify(props.propMatrix)) const clearLines = this.clearLines if (clearLines) { const animateColor = this.animateColor clearLines.forEach(index => { matrix[index]=[ animateColor, animateColor, animateColor, animateColor, animateColor, animateColor, animateColor, animateColor, animateColor, animateColor ] }) } else if (shape) { shape.forEach((m, k1) => m.forEach((n, k2) => { if (n && xy[0] + k1 >= 0) { // 竖坐标可以为负 let line = matrix[xy[0]+k1] let color if (line[xy[1] + k2] === 1 && !clearLines) { // 矩阵与方块重合 color = 2 } else { color = 1 } line[xy[1] + k2]=color matrix[xy[0] + k1]=line } }) ) } return matrix }, clearAnimate() { const anima = callback => { t(() => { this.animateColor = 0 t(() => { this.animateColor = 2 if (typeof callback === 'function') { callback() } }, 100) }, 100) } anima(() => { anima(() => { anima(() => { t(() => { states.clearLines(this.propMatrix, this.clearLines) }, 100) }) }) }) }, over(nextProps) { let overState = this.getResult(nextProps) this.overState = JSON.parse(JSON.stringify(overState)) const exLine = index => { if (index <= 19) { overState[19 - index]=fillLine } else if (index >= 20 && index <= 39) { overState[index - 20]=blankLine } else { states.overEnd() return } this.overState = JSON.parse(JSON.stringify(overState)) // console.log(JSON.stringify(overState)) } for (let i = 0; i <= 40; i++) { t(exLine.bind(null, i), 40 * (i + 1)) } } } }