在A-frame中,我如何制作一个游戏-controler.api'gamepadbuttondown:0'模仿javascript

时间:2017-06-10 20:32:25

标签: onclick onclicklistener aframe webvr gamecontroller

我正试图在A-Frame控制环境照明中对墙壁进行灯光开关。

我在场景中放置了实际灯光,因此我可以为它们命名,并使用javascript进行更改。

因为我无法获得游戏控制器gamepadbuttondown:0(或5) 要注册为onClick事件,我向a-entity添加了一个动画 交换机本身,我有一个事件监听器准备启动并进行更改。

桌面PC上的所有功能都可以通过实际鼠标和onClick事件进行编程,但是当使用价格便宜的5美元Mocute控制器在VR头戴式手机上试戴手机时,我已经卡住了。

                <a-entity id="lightswitch" onclick="WorksFineOnPC();" >
                <a-box geometry="height:4.5; depth:4.5; width:.25" position="143 48 14" material="src:https://www.myWebsite/pic.jpg;">
                    <a-animation id="LightAnimation" attribute="rotation" to="0 360 0" dur="100" begin="gamepadbuttondown:0"></a-animation>
                </a-box>
            </a-entity>

用“点击”替换“gamepadbuttondown:0”在PC上正常工作, 但onClick函数可以正常工作,但仍无法控制遥控器。

gamepadbuttondown:0适用于声音,如本例所示:

<a-entity gamepad-controls
      sound="src: pew-pew.wav;
             on: gamepadbuttondown:7">

这个控制器和其他控制器工作正常,所以错误在动画触发事件的某个地方。

我计划将动画缩短到1毫秒而不是100。我只将它作为一种启动事件的方式包含在内,这样我就可以使用事件监听器来查看“animationend”的发送时间。 并希望它对用户不可见。

我尝试使用空动画,      但如果我将类型和方向排除在外,则框无法渲染。

如果可能的话,我想完全跳过动画,如果有人知道如何使用按钮[x]而不是使用实际鼠标从控制器触发onclick事件。 是否有raycaster解决方案?直接访问引擎盖下的Three.js?

2 个答案:

答案 0 :(得分:0)

在Web浏览器中,onclick="foo()"语法表示当事件使用类型click触发时,执行该函数。由于按下按钮不是点击,因此onclick对您没有任何帮助。

相反,您可以为任何类型的事件类型创建一个侦听器:

var lightswitchEl = document.querySelector('#lightswitch');
lightswitchEl.addEventListener('gamepadbuttondown:7', function () {
  console.log('button pressed!');
});

如果你希望那是&#34;声明&#34;在你的HTML中,只需注册一个A-Frame组件来为你倾听:

AFRAME.registerComponent('my-listener', {
  init: function () {
    this.el.addEventListener('gamepadbuttondown:7', function () {
      console.log('button pressed!');
    });
  }
});

然后:

<a-entity id="lightswitch" my-listener></a-entity>
  

注意:gamepadbuttondown:7事件不是浏览器创建的普通事件。它是为了gamepad-controls组件的方便而生成的。

答案 1 :(得分:0)

@Don McCurdy,好的,所以我离开了Fusion-Cursor, 并添加了一个onClick事件到&#34;设置焦点主题&#34;用var。

onclick="SetSubjectOfFocus('light switch');

然后我添加了3个不同的事件监听器:moseup,touchend和button:0 所有3个活动都将启动“待办事项列表”。功能

然后该函数将查看分配给焦点主题的var, 并使用if-then语句清单激发期望的效果。

我正在使用&#39;点击&#39;但融合导致了我所看到的一切 自动选择。我可能会添加一个切换按钮,默认情况下为没有游戏手柄的人启用它,但如果检测到游戏手柄则将其关闭。 (即不添加事件监听器,或添加一个。)

https://jsfiddle.net/RonK/vm81ddn7/8/

我需要将设置融合超时返回到0,这样就没有延迟,如果你赶时间,它不会意外点击旧项目。

这可以添加到下一版本的gamepad-controls.js中。 我建议在后端使用所有这些,除了:

<a-entity id="lightswitch" my-listener></a-entity>

<a-entity id="lightswitch" onClick="DoSomething();"></a-entity>

你可以添加:

<a-entity id="lightswitch" OnTriggerEvent="DoSomething();"></a-entity>