Cocos2d iphone 设置一组实体以相互吸引/拒绝

Cocos2d iphone 设置一组实体以相互吸引/拒绝,cocos2d-iphone,box2d,box2d-iphone,Cocos2d Iphone,Box2d,Box2d Iphone,使用cocos2d和box2d,我有一些身体需要它们相互吸引,还有一些身体需要它们相互排斥。 这意味着,当它们靠近时,会像磁铁一样吸引,或者拒绝并推开 我是否必须以艰难的方式编程(检查它们之间的距离,而不是在它们靠近时施加力) ,还是有更简单的方法 非常感谢 我必须用很难的方式编程吗 是的。目前,Box2d(或cocos2d)中没有内置任何功能来执行此操作 编辑 关于你的评论: 你知道如何开始检查每个人的近身以及他们之间的距离吗 这将取决于你有多少身体,以及你想使用哪种技术。如果你有很多身体,

使用cocos2d和box2d,我有一些身体需要它们相互吸引,还有一些身体需要它们相互排斥。 这意味着,当它们靠近时,会像磁铁一样吸引,或者拒绝并推开

我是否必须以艰难的方式编程(检查它们之间的距离,而不是在它们靠近时施加力) ,还是有更简单的方法

非常感谢

我必须用很难的方式编程吗

是的。目前,Box2d(或cocos2d)中没有内置任何功能来执行此操作


编辑 关于你的评论:


你知道如何开始检查每个人的近身以及他们之间的距离吗

这将取决于你有多少身体,以及你想使用哪种技术。如果你有很多身体,你可能想看看四叉树来划分你的空间,然后快速忽略那些不近的身体

如果你没有那么多,你可以在O(n^2)时间内用一个简单的双for循环迭代你的身体

NB:这决不是一个完整的解决方案,你应该考虑它是伪代码,因为它是不可编译的。

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) */
    }
} 

没有比这更简单的方法了。你知道怎么开始检查每个人的身体吗?他所有的近身以及他们之间的距离。谢谢。我就是这么想的,我没有太多,少于15个。我在想,是否有一种方法可以使用我已有的接触式听者,不仅检查身体何时接触,而且检查身体何时靠近。有没有办法补充一下?你的答案很好。顺便问一下,你是说继续爆发吧?因为当它们相等时,它是同一个物体,所以我必须转到下一个……如果我没记错的话,当它们的边界框相交时,物体算作“碰撞”,而不是“接触”。我会看看是否能找到文档。这是我所指的关于碰撞的文档。