javascript - 碰撞追踪
问题描述
我在 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);
}
解决方案
我认为这取决于你想用碰撞系统实现什么。当前的方法更重视“轻松获取每个对象的碰撞” ,而不是“记录所有碰撞的日志”。
这是您的方法和替代方法:
你的方法:
每次碰撞都被推入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
推荐阅读
- amazon-web-services - 如何向 Cloudfront 添加查询字符串参数?
- php - 通过php使用jsGrid上传图片
- ios - 目标 _blank 链接未在 SFSafariViewController 中打开
- ios - 如何在嵌入式 UIImagePickerController 中隐藏导航栏
- java-ee-7 - Arquillian 与托管的 wildfly-14.0.1.Final,在测试中注入 null
- android - 如何访问最近拍摄的屏幕截图?(安卓工作室,Java)
- multithreading - 如何将 args 传递给并行 foreach
- json - 数组计数和解析中的Json Array
- c# - 视图模型的页面导航
- kubernetes - 如何在 GKE 上提供对 Kubeflow 的访问权限?