基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码

2019-01-28 21:06:33丽君

在完成方块的位移与变形之后,我们的小游戏就只差最后一步了:对填充满的方块进行消除。在开始的时候,我们就知道所有的信息都是保存在数据模型当中,所以我们要消除方块。只需要将它们从数据模型中删除即可,实现代码如下:

function deleteBlock(block){   // 消除已经填充满的方格   var yindexs = []; // 要判断的y轴坐标   var num = 0;   for(var i = 0; i < block.size(); i ++){     var childNode = block.getChildAt(i);     var childy = childNode.getPosition().y;     var nodeList = g2d.getDatasInRect({x:233, y:childy, width:638, height:2}, true, false);     if (nodeList.length == 15) {       for(var i = 0; i < nodeList.length; i++){         gameDM.remove(nodeList.get(i)); // 在数据模型中移除对应的图元       }       num ++;       yindexs.push(childy);     }   }   if (yindexs.length > 0) {     for(var i = 0 ; i < yindexs.length; i++){       // 将被消除图元上方的图元进行组合,并整体向下移动一个位置       var yindex = yindexs[i];       var h = yindex - 133 - offset;       var moveList = g2d.getDatasInRect({x:233, y:133, width:638, height:h}, true, false);       var mblock = new ht.Block();       for(var i = 0; i < moveList.size(); i++){         mblock.addChild(moveList.get(i));       }       moveBlock('y', offset, mblock);     }   } }

到此,一个简单的俄罗斯方块小游戏就实现了。当然,这个游戏还有很多可以拓展的地方,比如:更多的方块类型,游戏分数的统计,下一步预测窗体,游戏背景修改等。这些先不考虑,我们先开始下一步。

创建 3D 模型

在 3D 建模文档中了解到,HT 通过一个个三角形来组合模型。

首先,先将网络上查找到的街机模型进行拆分,将其中的各个模块拆分成三角形面:

如图所示,将0所在位置设置为原点(0,0,0),我们打开画图工具根据标尺大概估计出每个坐标相对原点的位置,将计算好的坐标数组传入 vs 中,同时在is顶点索引坐标中将每个三角图形的组合传入其中:

ht.Default.setShape3dModel('damBoard', { // 为新模型起名   vs: [     0, 0, 0, //0     0.23, 0, 0,     0.23, 0.27, 0,     0.27, 0.28, 0, //3     0.27, 0.32, 0,     0.20, 0.33, 0,     0.18, 0.51, 0, // 6     0.27, 0.57, 0,     0.27, 0.655, 0,     0.20, 0.67, 0, // 9     0, 0.535, 0   ],   is: [     0, 1, 2,     0, 2, 5,     2, 3, 4,     4, 2, 5,     5, 0, 10,     10, 5, 6,     6, 7, 8,     8, 6, 9,     9, 10, 6   ] });