碰撞追踪

Collision tracking

我正在 P5.js 项目中添加碰撞,但我需要以某种方式跟踪哪些对象与其他对象发生碰撞,以便我可以为它们创建各种 "relationships"。

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

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);
}

我认为这取决于你想用碰撞系统实现什么。当前的方法更重视 "easily get collisions per object" 而不是 "keep a log of all collisions".

这是您的方法和替代方法:

你的方法:

每次碰撞都被推入碰撞对象的 object.relationShipList

  • 获取所有碰撞的简单快捷方式每个对象:仅读取object.relationShipList
  • 获取所有碰撞日志的非常困难的方法:获取所有碰撞日志需要调用 object.relationShipList 每个对象 并将每个碰撞保存在一个新的数组。
  • 会导致数据重复:如果有多个物体碰撞,每个物体都会产生自己的碰撞。

我会选择的备选方案:

每次碰撞都被推送到一个全局数组中。当对象 a 与对象 b 发生碰撞时,您注册一个 window.collisionSystem.push([a, b]).

  • 获取每个对象碰撞的稍微复杂一点的方法:您需要查询 window.collisionSystem 来获取碰撞。这可以通过像
  • 这样的函数来实现
function getCollisionsFor(ob) {
  return window.collisionSystem.filter(e => {
    if (e[0] === ob || e[1] === ob) return true;
  })
}

然后像 getCollisionsFor([objectIWant]) 一样调用它以获得 objectIWant 对象的新碰撞数组。

  • 在没有重复数据的情况下跟踪所有碰撞的简单方法:这是-当然- window.collisionsSystem 数组。
  • 修剪数据的简单方法:只需 window.collisionSystem = []; 清理对象。

推荐阅读游戏引擎中有关此特定问题的内容,请参阅:https://books.google.com/books?id=EwlpDwAAQBAJ&pg=PT726&lpg=PT726&dq=havok+collision+tracking&source=bl&ots=Eav72q2T95&sig=ACfU3U15UvAqvf4FmjYKOAsm1CPMlyaFQA&hl=en&sa=X&ved=2ahUKEwi559zSgJDmAhXHnuAKHQv0ATAQ6AEwCXoECAwQAQ#v=onepage&q=havok%20collision%20tracking&f=false