Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.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 碰撞跟踪_Javascript_Object_Collision - Fatal编程技术网

Javascript 碰撞跟踪

Javascript 碰撞跟踪,javascript,object,collision,Javascript,Object,Collision,我在一个P5.js项目中添加了碰撞,但我需要以某种方式跟踪哪些对象与其他对象发生了碰撞,以便为它们创建各种“关系” 我是否应该将对象数据放入数组中?我想也许每个物体都应该追踪它自己的关系 crossPaths(other) { let d = dist(this.pos.x,this.pos.y,other.pos.x,other.pos.y); d < (this.size/2 + other.size/2) ? true : false; } createRelati

我在一个P5.js项目中添加了碰撞,但我需要以某种方式跟踪哪些对象与其他对象发生了碰撞,以便为它们创建各种“关系”

我是否应该将对象数据放入数组中?我想也许每个物体都应该追踪它自己的关系

crossPaths(other) {
    let d = dist(this.pos.x,this.pos.y,other.pos.x,other.pos.y);
    d < (this.size/2 + other.size/2) ? true : false;
}

createRelationship(other) {
    this.relationShip = other;
    this.relationShipList.push(this.relationShip);
}
交叉路径(其他){
设d=dist(这个位置x,这个位置y,其他位置x,其他位置y);
d<(this.size/2+other.size/2)?真:假;
}
创建关系(其他){
这个关系=其他;
this.relationShipList.push(this.relationShip);
}

我认为这取决于你想用碰撞系统实现什么。当前的方法更重视“容易获得每个对象的碰撞”,而不是“记录所有碰撞”

以下是您的方法和备选方案:

你的做法: 每次碰撞都会被推送到对象中。碰撞对象的relationShipList

  • 获取每个对象的所有冲突的简便快捷方法:仅读取对象。关系列表
  • 获取所有冲突的日志非常困难:获取所有冲突的日志需要对每个对象调用
    object.relationShipList
    ,并将每个冲突保存在新数组中
  • 将导致数据重复:如果有多个对象发生碰撞,每个对象将生成自己的碰撞
我会选择的替代方案: 每一次碰撞都被推送到一个全局数组中。当对象
a
与对象
b
发生冲突时,您注册一个
窗口.collisionSystem.push([a,b])

  • 获取每个对象的碰撞的更复杂的方法是:您需要查询
    window.collisionSystem
    来获取碰撞。这可以通过以下功能实现
然后像([ObjectWant])那样调用它,为
ObjectWant
对象获取一个新的冲突数组

  • 无需重复数据即可跟踪所有冲突的简单方法:当然,这是
    窗口.collisionsystem
    数组
  • 修剪数据的简单方法:只需
    window.collisionSystem=[]以清除对象

推荐阅读游戏引擎中有关此特定问题的书籍,请参阅:

谢谢。我已经试着去推数组了,但是因为冲突/重叠发生了好几毫秒,所以这些对被一次又一次地添加。我现在正在尝试一个版本,使用pairs作为对象,首先检查数组以确保尚未添加它们。
function getCollisionsFor(ob) {
  return window.collisionSystem.filter(e => {
    if (e[0] === ob || e[1] === ob) return true;
  })
}