//俄罗斯方块下落
function down(){
//pos就是当前的(前台)俄罗斯方块,这里y坐标++,就相当于下落
++pos.y;
//如果俄罗斯方块和场景实体重合了的话
if(is()){
//这里的作用是消行
for(var i = 0; i < 4 && pos.y + i < 22; i++) {
//和实体场景进行位或并且赋值,如果最后赋值结果为0xfff,也就说明当前行被完全填充了,可以消行
if((map[pos.y + i] |= pos.fk[i]) == 0xfff) {
//行删除
map.splice(pos.y + i, 1);
//首行添加,unshift的作用是在数组第0号元素之前添加新元素,新的元素作为数组首元素
map.unshift(0x801);
}
}
//如果最上面一行不是空了,俄罗斯方块垒满了,则游戏结束
if(map[1] != 0x801) {
return over();
}
//这里重新产生下一个俄罗斯方块
start();
}
//否则的话更新,因为这里不是局部更新,是全局更新,所以重新绘制一下map就可以了
update();
}
//左右移动,t参数只能为2或者是0.5
//这样实现左移右移(相当于移位运算)这种方法也很丑陋,但是为了简短只能这样了
//这样做很丑陋,但是可以让代码简短一些
function move(t, k){
pos.x += k;
for(var i = 0; i < 4; i++) {
//*=t在这里实现了左右移1位赋值的功能
pos.fk[i] *= t;
}
//左右移之后的更新,这里同样进行了重合判断,如果和左右墙重合的话,那么一样会撤销操作并且不更新场景
update(is());
}