首页 > 解决方案 > 碰撞追踪

问题描述

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

标签: javascriptobjectcollision

解决方案


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

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

你的方法:

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

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

我会选择的替代方案:

每个碰撞都被推入一个全局数组。当 object与 objecta碰撞时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 = [];为了清理对象。

Recommended reading about this particular question in Game Engines, see: 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


推荐阅读