Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 联网的A帧为新用户分配不同的位置_Javascript_Multiplayer_Aframe - Fatal编程技术网

Javascript 联网的A帧为新用户分配不同的位置

Javascript 联网的A帧为新用户分配不同的位置,javascript,multiplayer,aframe,Javascript,Multiplayer,Aframe,我的多人a-Frame环境中有一个问题,我用网络a-Frame设置了这个环境 我希望前三个连接的用户有一个不同的繁殖位置,任何其他用户在第三个位置繁殖,但我无法让它工作。以下是迄今为止我在Html中的内容: <a-entity id="player" networked="template:#avatar-template;showLocalTemplate:true;" camera positioner="" wasd-controls look-controls> &

我的多人a-Frame环境中有一个问题,我用网络a-Frame设置了这个环境

我希望前三个连接的用户有一个不同的繁殖位置,任何其他用户在第三个位置繁殖,但我无法让它工作。以下是迄今为止我在Html中的内容:

 <a-entity id="player" 
networked="template:#avatar-template;showLocalTemplate:true;" 
camera 
positioner=""
wasd-controls 
look-controls>
<a-cursor></a-cursor>  
</a-entity>
我发现我必须像这样同步其他组件:

var avatarSchema = {
template: '#avatar-template',
components: [
'positioner',
'position',
'rotation',
'scale',
{
  selector: '.head',
  component: 'material'
},
{
  selector: '.hairs',
  component: 'show-child'
}


]
};
       NAF.schemas.add(avatarSchema);

这是一个大项目,所以有更多的代码。如果您还需要场景设置或化身设置,请告诉我,我会添加它。

我有一个解决方法,因为我不完全了解组件的工作原理。
我发现在参考
NAF.entities.entities

我制作了一个附加到场景的组件:

AFRAME.registerComponent('foo',{
  init:function(){
    setTimeout(function(){   
      console.log(Object.keys(NAF.entities.entities));
      console.log(Object.keys(NAF.entities.entities)[0]);
      console.log(Object.keys(NAF.entities.entities).length);
    },5000);
  }
});
第一个日志为我提供了玩家id的数组。
第二个元素给出了第一个元素的id
最后一个给了我球员的人数

您可以检查加载的玩家数量,并根据加载的玩家设置其位置属性

if(NAF.. == 1) this.el.setAttribute('position',firstPos);
if(NAF.. == 2) this.el.setAttribute('position',secondPos);
if(NAF.. > 2) this.el.setAttribute('position',third);

此处的工作故障:glitch.com/edit/#/鹿角突
当然,我不应该等5秒钟,而是应该听一个加载的事件,我会在我不忙的时候再看一看。

如果有人成功地使用此组件正确执行此操作,请发表评论,因为我尝试在连接上定位(太早,其他玩家实体仍未加载),尝试等待场景加载,但我得到的最接近的结果是在获得玩家数量时动态创建玩家,经过一段固定的时间。

我在下面想出了一个有点骇客的解决方案,但我现在已经找到了一个明确的方法来确定何时连接

让连接解析;
让连接承诺=新承诺((解决、拒绝)=>{
连接解析=解析;
})


这似乎不是一个好的事件,但他们确实提到了这些功能,我们可以用一种不太粗糙(如果不是很优雅)的方式使用。

在我看来,定位器将为每个玩家触发一次,因此计数器将始终为0。你知道如何得到球员名单吗?你可以改变位置,这取决于你是哪一个球员加入时,这听起来是合理的。不,我不知道如何获得玩家名单,我该怎么做?这就是为什么我问,我不知道:D甚至把它放在问题中:。如果我得到任何答复,我会告诉你的。如果你找到了一个方法,请把它贴成anwserAh我明白了:D好的,我会的,谢谢!我想我有一些东西看起来不错,我会在几分钟后检查一下,然后告诉你它是如何工作的@Riccardo如果它能工作,试着找出哪个事件应该执行position函数(而不是临时的5秒),我没有让它在我的项目中工作。我正确地使用了console.logs,但在选择时遇到了问题。我做了一些研究,并决定采用firebase解决方案,因为使用实际服务器似乎比使用我的机器作为主机更合理。但是非常感谢你的努力!
if(NAF.. == 1) this.el.setAttribute('position',firstPos);
if(NAF.. == 2) this.el.setAttribute('position',secondPos);
if(NAF.. > 2) this.el.setAttribute('position',third);
function onConnected(callback) {
   setTimeout(() => {
     if (NAF.connection.isConnected()) {
       callback(NAF.connection.getConnectedClients())
     }
     else onConnected(callback)

   }, 100)
}