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

2020-04-25 07:43:31易采站长站整理

  } else if (e.keyCode == 68) {
    // right d
    moveBlock('x', offset, block);
  } else if(e.keyCode == 83){
    // down s
    moveBlock('y', offset, block);
  }
}, false);

setInterval(function(){
  if(!moveBlock("y", offset, block)){
    //无法进行位移,创建新的方块
    rotationNum = 0; //方块翻转次数归0
    block = createNode(blockType); //生成新的方块
    blockType = parseInt(Math.random()*100%5); //下一次生成的方块图形
  }
}, intervalTime); //执行间隔

//移动方块,移动成功时返回:true,无法移动时返回:false
function moveBlock(axis, offset, block){

  // 移动方块
  var ids = [];
  var yindexs = [];
  var indexArr = new Array();
  for(var i = 0; i < block.size(); i ++){
    var childNode = block.getChildAt(i);
    var childx = childNode.getPosition().x;
    var childy = childNode.getPosition().y;
    if (yindexs.indexOf(childy) == -1) {
      yindexs.push(childy);
    }

    if(axis === 'x'){
      childx += offset;
    }else if (axis === 'y') {
      childy += offset;
    }

    // 验证方块的移动是否超出边界
    if(childx < leftSize || childx > rightSize || childy > bottomSize){
      return false;
    }

    var obj = new Object();
    obj.x = childx;
    obj.y = childy;

    indexArr.push(obj);
    ids.push(childNode.getId());
  }

  //判断图形位移过程中是否与其他方块触碰
  for(var j = 0; j < yindexs.length; j ++){
    var indexY = yindexs[j];
    if (axis === 'y') {
      indexY += offset;
    }
    //getDatasInRect 方法能获取到一个范围中的所有图元信息
    var nodeList = g2d.getDatasInRect({x:233, y:indexY, width:638, height:2}, true, false);

    if(nodeList.length > 0){
      // 触碰
      for(var i = 0; i < nodeList.length; i++){
        var x = nodeList.get(i).getPosition().x;
        var y = nodeList.get(i).getPosition().y;

        var id = nodeList.get(i).getId();
        if (ids.indexOf(id) > -1) {
          // 位移的图元
          continue;
        }

        for (var k = 0; k < indexArr.length; k++) {
          var obj = indexArr[k];
          if (obj.x === x && obj.y === y){