A-Frame组件之间的异步交互

时间:2017-06-20 06:43:42

标签: javascript virtual-reality aframe

我正在尝试生成一个对象,以防激光对象和可碰撞对象之间存在交集。我正在使用raycaster来检测碰撞。

只有在发生碰撞并且用户按下触发按钮的情况下,才能生成我想要的对象。

我正在考虑在按下pressed事件侦听器时创建全局变量triggerdown,并且只有在此变量设置为true时,raycaster-intersection事件侦听器才会生成对象。< / p>

const pressed = false

AFRAME.registerComponent('laser', {
  init: function () {
    const laser = this.el.sceneEl.querySelector('#laser');
    laser.addEventListener('raycaster-intersection', function(event) {
      console.log('raycaster-intersection', event.detail.intersections[0].point)
      if (pressed) {
        console.log('spawn')
      }
    });
  }
})

AFRAME.registerComponent('spawner', {
  init: function () {
    const blockHand = this.el.sceneEl.querySelector('#blockHand');
    blockHand.addEventListener('triggerdown', function(event) {
      pressed = true
    });
    blockHand.addEventListener('triggerup', function(event) {
      pressed = false
    });
  }
})

我不喜欢使用全局变量,但我不知道在这种情况下如何在没有它们的情况下解决这个问题。

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

一些解决方案:

  1. 执行this.el.addState('pressed')this.el.removeState('pressed')更新状态,并使用this.el.is('pressed')进行检查。

  2. 将组件组合在一起并将其存储为this.pressed

  3. A-Frame master build,即将推出0.6.0,它有一个激光控制组件,你可以使用https://aframe.io/docs/master/components/laser-controls.html所以你所要做的就是听click而不是听对于raycaster交叉和触发向下。并且您可以免费获得所有控制器支持。