【发布时间】:2012-11-13 04:32:15
【问题描述】:
我在我的应用程序中使用 Box2D 和 Cocos2D。所以几乎在我的应用程序中,我让身体跟随我的 CCSprites,即使人们反对它。此外,我只使用 Box2D 进行碰撞检测,所以我只是将一个主体附加到我的精灵并使用 b2ContactListener 和 nothing 其他。无论如何,除了这个小问题之外,这个设置大部分都有效。
所以我的身体在游戏循环中像这样跟随我的精灵:
for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *)b->GetUserData();
b2Vec2 b2Position = b2Vec2(sprite.position.x/PTM_RATIO, sprite.position.y/PTM_RATIO);
float32 b2Angle = -1 * CC_DEGREES_TO_RADIANS(sprite.rotation);
b->SetTransform(b2Position, b2Angle);
}
}
我也像这样创建我的 b2World(如果有什么不同的话):
world = new b2World(b2Vec2(0.0f, 0.0f));
world->SetAllowSleeping(NO);
_contactListener = new MyContactListener();
world->SetContactListener(_contactListener);
这个问题是,每当我的 CCSprite 碰撞(从技术上讲,我的 b2Body 也在碰撞)时,每个 CCSprite 上的 b2Body 似乎会移动一点,就好像一个微小的力刚刚击中它一样,所以如果这是有道理的,它们就会有“后坐力”。即使不涉及任何力量,当击中发生时,它们也会彼此远离。
另一个例子是当我的一个身体坐在另一个身体的顶部时,当我站在它的边缘时,被站立的身体似乎有点倾斜,这很奇怪,因为我没有倾斜我的精灵。
最后,我的身体似乎有点落后于精灵在那一刻的位置,我不确定这是否也与这个问题有关,但无论如何有什么理由会发生这种情况吗?有什么办法可以让物体不受力的影响,只用于碰撞?
谢谢!
【问题讨论】:
-
我相信它是这样的:如果两个物体碰撞并且它们开始彼此远离,那么两个物体一定是用力相互碰撞的。他们每个人身上的力使它们运动,除非受到作用,否则运动中的物体会保持运动。如果它们在运动,它们将不会停止,因为没有其他东西作用于它们。我认为可能涉及到一种力量。
-
有点,当身体相互碰撞时,身体会以不同的方式向奇怪的方向移动,但很快就会回到原来的位置,而实际上它们不应该向那个奇怪的方向移动总体。他们应该只是跟随他们所附着的精灵。除了 b2ContactListener 之外,我还必须在我的项目中添加任何强制或任何其他 Box2D 相关代码。
-
现在我不确定这是否是一个问题,虽然我在调试我的 b2World 时确实看到了这种行为,但这可能不是发生以下情况的原因。现在在我的游戏中,我的身体有点小,它们确实移动得很快,有时当它们应该发生碰撞时它会因为未知原因而错过,尽管所有代码都是正确的,这可能是因为这个或我不确定的其他原因.任何提示/想法/建议将不胜感激!
-
我不确定这是否是最好的方法,但如果有人想确认这一点:您是否尝试在碰撞发生时将两个对象都设置为静态?
objectA->setType(b2_staticBody) -
或者更好的是在它们碰撞时将它们的速度设置为零?
标签: ios cocos2d-iphone box2d collision-detection