我在我的应用程序中使用Box2D和Cocos2D。所以在我的应用程序中,即使人们推荐反对它,我也会按照我的CCSprites进行操作。另外我只使用Box2D进行碰撞检测,所以我只是将一个物体附加到我的精灵上,并使用b2ContactListener和 无 其他。无论如何,除了这个小问题之外,这个设置大部分都有效。
所以我的身体在游戏循环中遵循我的精灵:
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);
这个问题是,每当我的CCSprites发生碰撞时(技术上我的b2Bodys也会发生碰撞),每个CCSprite上的b2Body似乎移动了一下,好像一个微小的力量刚刚击中它所以如果有意义的话它们会有“反冲”。即使没有任何力量,它们在击中时也会相互移动得更远。
另一个例子是,当我的一个身体坐在另一个身体的顶部时,当我在它的边缘时,正站立的身体似乎有点倾斜,这是奇怪的,因为我没有倾斜我的精灵。
最后,我的身体似乎有点落后精灵在那个确切的时刻,我不确定这是否也与这个问题有关,但无论如何是否有任何理由为什么会发生这种情况?是否有任何方法可以使身体不受力的影响而仅用于碰撞?
谢谢!
答案 0 :(得分:3)
我相信这些物体在碰撞时会触发碰撞响应,导致它们瞬间分开一点,然后在你强制他们的b2变换与下一个游戏勾号中精灵的位置/角度同步时再回到原位。
由于您纯粹使用Box2D进行碰撞检测,您是否将灯具定义的 isSensor 属性设置为true?
b2FixtureDef shapeDef;
shapeDef.isSensor = true;
通过特别将灯具标记为传感器,它将永远不会与任何物体碰撞,但是当通过接触式听众发生物体重叠时,您仍会收到通知。