60行JavaScript代码俄罗斯方块游戏全解析(2)

//此对象之中存储的是按键键值(上,下,左,右)和函数之间的调用映射关系,之后通过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()); 
            }     

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/00d24c0ff618be9a598dac43d4563e18.html