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

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

  dataModel.add(node);
}

最终效果如下:

将 2D 小游戏贴到3D模型上,在文档中我们可以发现 setImage 属性不仅仅是只能设置正常的图片,还可以使用它来注册一个 canvas 图形组件。而2D视图可以通过 getCanvas() 来获取画布信息。


ht.Default.setImage('gameScrn', g2d.getCanvas());
ht.Default.setShape3dModel('scrn', {
  vs: vsArr,
  is: isArr,
  uv: scrnUV,
  image: 'gameScrn' // 将注册的2d画布信息当成屏幕的图片贴图信息
});

// 设置 2d 的画布大小
g2d.getWidth = function () { return 1000; }
g2d.getHeight = function () { return 600; }
g2d.getCanvas().dynamic = true;//设置这个是为了让canvas能动态显示

// 设置计时器,让2d画布上的每次改变都能及时的在3D模型上进行展示
setInterval(function () {
  node.iv(); // 每次改变都需要对街机模型进行刷新,刷新时间为下一帧
  g2d.validateImpl(); // 立即对2D上的图元进行刷新
}, 10);

// 设置500毫秒后,缩放平移整个2D画布以展示所有的图元
setTimeout(function () {
  g2d.fitContent(true);
}, 500);

效果如下:


 

在 2D 画布上,我们已经为游戏添加了键盘事件,现在我们只需要为 3D 模型上的5个按钮分别绑定对应方法即可:


g3d.mi(function (e) { // addInteractorListener 交互事件监听器的缩写

  if (e.kind === 'clickData') { // 判断是否为点击事件
    var tag = e.data.getTag();
    if (tag === 'restart') {
      gameAgain(node);
    }
    if (start) {
      if (tag === 'up') {
        block.setRotation(Math.PI * (1 + rotationNum) / 2);
        rotationNum++;
        if (!checkRotation(block)) {
          // 边缘变形限制
          rotationNum--;
          block.setRotation(Math.PI * rotationNum / 2);
        }
      } else if (tag === 'down') {
        moveBlock('y', offset, block);
      } else if (tag === 'left') {
        moveBlock('x', -offset, block);
      } else if (tag === 'right') {
        moveBlock('x', offset, block);
      }
    }
  }
});

到此基本完成了在3D街机上玩游戏的功能。

http://www.hightopo.com/demo/tetris/