我从这里使用Ray Wenderlich的代码:http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

这是我用来向CCSprite添加b2Body / Def / Fixture的代码:

- (void)addBoxBodyForSprite:(CCSprite *)sprite {
    b2BodyDef spriteBodyDef;
    spriteBodyDef.type = b2_dynamicBody;
    spriteBodyDef.position.Set(sprite.position.x/CTM_RATIO, sprite.position.y/CTM_RATIO);
    spriteBodyDef.userData = sprite;
    b2Body *spriteBody = world->CreateBody(&spriteBodyDef);
    b2PolygonShape spriteShape;
    spriteShape.SetAsBox(sprite.contentSize.width/CTM_RATIO/2, sprite.contentSize.height/CTM_RATIO/2);
    b2FixtureDef spriteShapeDef;
    spriteShapeDef.shape = &spriteShape;
    spriteBody->CreateFixture(&spriteShapeDef);
}


我选择了CTM_Ratio而不是PTM_Ratio。无论如何,我的b2Bodies都没有正确放置在CCSprite上。

因此,为了解释我的问题,我会说我的子画面宽50像素,高100像素。好像我在那个精灵上的b2Body宽60像素,高110像素。

我知道Box2D使用仪表,但是有什么方法可以完美地实现,但是b2Body可以通过使用Pixels到CCSprite上吗?

谢谢!

最佳答案

什么是CTM_RATIO?我暂时假设它只是PTM_RATIO的不同值,在这种情况下,您可以简单地更改PTM_RATIO值。

存在PTM_RATIO的唯一原因不是因为Box2D使用仪表。这是因为Box2D最好在0.1到100.0范围内使用。因此,将所有位置值缩小到该范围内并返回的任何比率都可以。您可以简单地将Box2D位置视为像素位置-或更准确地说,对于iOS设备:点位置。但是,这可能会导致Box2D出现性能和仿真问题,例如穿透对象等。因此,建议不要使用PTM_RATIO。

我最好的猜测是,您只是忽略了使用CTM_RATIO更改一次PTM_RATIO的情况,这会导致未对准。唯一的另一种选择是,您在分别计算Box2D对象的位置或大小和分别代表实体视觉外观的精灵时,都犯了一个错误。

关于ios - b2Body在CCSprite上的位置不正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8220995/

10-14 05:38