我正在尝试生成一个对象,以防激光对象和可碰撞对象之间存在交集。我正在使用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
});
}
})
我不喜欢使用全局变量,但我不知道在这种情况下如何在没有它们的情况下解决这个问题。
有什么建议吗?
谢谢!
答案 0 :(得分:2)
一些解决方案:
执行this.el.addState('pressed')
和this.el.removeState('pressed')
更新状态,并使用this.el.is('pressed')
进行检查。
将组件组合在一起并将其存储为this.pressed
。
A-Frame master build,即将推出0.6.0,它有一个激光控制组件,你可以使用https://aframe.io/docs/master/components/laser-controls.html所以你所要做的就是听click
而不是听对于raycaster交叉和触发向下。并且您可以免费获得所有控制器支持。