//此对象之中存储的是按键键值(上,下,左,右)和函数之间的调用映射关系,之后通过eval可以做好调用映射
var keycom = {"38" : "rotate(1)",
"40" : "down()",
"37" : "move(2, 1)",
"39" : "move(0.5, -1)"};
//dia存储选取的俄罗斯方块类型(一共七种俄罗斯方块类型)
//pos是前台正在下落的俄罗斯方块图案(每一种俄罗斯方块类型有属于自己的图案,如果不清楚可以查看上文的锯齿数组)对象
//bak里存储关于pos图案对象的备份,在需要的时候可以实现对于pos运动的撤销
var dia, pos, bak, run;
//在游戏场景上方产生一个新的俄罗斯方块
function start(){
//产生0~6的随机数,~运算符在JavaScript依然是位取反运算,隐式实现了浮点数到整形的转换,这是一个很丑陋的取整实现方式
//其作用是在七种基本俄罗斯方块类型之中随机选择一个
dia = tatris[~~(Math.random() * 7)];
//pos和bak两个对象分别为前后台,实现俄罗斯方块运动的备份和撤销
bak = pos = {fk : [], //这是一个数组存储的是图案转化之后的二进制数据
y : 0, //初生俄罗斯方块的y坐标
x : 4, //初生俄罗斯方块的x坐标,相对于右侧
s : ~~(Math.random() * dia.length)}; //在特定的俄罗斯方块类型之中随机选择一个具体的图案
//新生的俄罗斯方块不旋转,所以这里参数为0
rotate(0);
}
//旋转,实际上这里做的处理只不过是旋转旋转之后的俄罗斯方块具体图案,之后进行移位,根据X坐标把位置移动到场景里对应的地点
function rotate(r){
//这里是根据旋转参数 r 选择具体的俄罗斯方块图案,这里的 f ,就是上文之中的十六进制数
//这里把当前pos.s的值和r(也就是旋转角度)相加,最后和dia.length求余,实现了旋转循环
var f = dia[pos.s = (pos.s + r) % dia.length];
//根据f(也就是上文之中提供的 16 位数据)每4位一行填写到fk数组之中
for(var i = 0; i < 4; i++) {
//初生的俄罗斯方块pos.x的值为4,因为是4 * 4的团所以在宽度为12的场景里左移4位之后就位于中间四列范围内
pos.fk[i] = (f >> (12 - i * 4) & 0x000f) << pos.x;
}
//更新场景
update(is());
}
60行JavaScript代码俄罗斯方块游戏全解析(2)
内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:https://www.heiqu.com/00d24c0ff618be9a598dac43d4563e18.html