使用cocos2d和box2d,我有一些身体,我需要它们互相吸引,还有一些其他人互相拒绝。 这意味着当它们靠近时会吸引磁铁,或拒绝并推开。
我是否必须以艰难的方式对它进行编程(检查它们之间的距离,而不是在它们靠近时施加力) ,或者有一种更简单的方法?
非常感谢。
答案 0 :(得分:1)
我是否必须以艰难的方式对其进行编程?
是的。 Box2d(或cocos2d)目前没有内置任何功能。
与您的评论有关:
你是否知道如何开始检查每个身体所有的身体和所有身体之间的距离?
这取决于你有多少身体,你想要使用哪种技术。如果你有很多身体,你可能想看看四叉树来划分你的空间并快速忽略那些不接近的身体。
如果你没有那么多,你可以在O(n ^ 2)时间内用一个天真但相对简单的双循环迭代你的身体。
注意:这绝不是一个完整的解决方案,您应该将其视为伪代码,因为它不可编译。
for (b2Body *b in myBodies)
{
for (b2Body *b2 in myBodies)
{
if (b == b2) continue;
float distance = b2Distance(b->GetWorldCenter(), b2->GetWorldCenter());
if (shouldAttract)
{
float angle1 = b2Cross(b->GetWorldCenter(), b2->GetWorldCenter());
float angle2 = b2Cross(b2->GetWorldCenter(), b->GetWorldCenter());
b->ApplyForce(distance * angle1);
b2->ApplyForce(distance * angle2);
}
/* else if (shouldRepel) */
}
}