C++ 在box2d中为sprite创建b2body

C++ 在box2d中为sprite创建b2body,c++,cocos2d-iphone,box2d,C++,Cocos2d Iphone,Box2d,接下来,我创造了3个拥有自己身体的精灵——球和2个桨。我的问题可能很简单,对不起,我还在学习。无论如何,我的问题与示例不同,我的精灵是缩放的,即: -(id)init { p1 = [CCSprite spriteWithFile:@"1.png"]; p1.position = ccp(160, winSize.height * 0.08); p1.scaleX = 190 / 2 / p1.contentSize.width; p1.scaleY = 58 /

接下来,我创造了3个拥有自己身体的精灵——球和2个桨。我的问题可能很简单,对不起,我还在学习。无论如何,我的问题与示例不同,我的精灵是缩放的,即:

-(id)init {
    p1 = [CCSprite spriteWithFile:@"1.png"];
    p1.position = ccp(160, winSize.height * 0.08);
    p1.scaleX = 190 / 2 / p1.contentSize.width;
    p1.scaleY = 58 / 2 / p1.contentSize.height;

    b2BodyDef p1BodyDef;
    p1BodyDef.type = b2_dynamicBody;
    p1BodyDef.position.Set(160/PTM_RATIO, 40/PTM_RATIO);
    p1BodyDef.userData = p1;
    _p1Body = _world->CreateBody(&p1BodyDef);

    b2PolygonShape p1Shape;
    p1Shape.SetAsBox(p1.contentSize.width/PTM_RATIO/2, p1.contentSize.height/PTM_RATIO/2);

    b2FixtureDef p1ShapeDef;
    p1ShapeDef.shape = &p1Shape;
    p1ShapeDef.density = 0.3f;
    p1ShapeDef.friction = 1.0f;
    p1ShapeDef.restitution = 0.0f;
    _p1Fixture = _p1Body->CreateFixture(&p1ShapeDef);
}
在创建主体之后,我创建了一个更新方法,使用contact listener检测我的桨和球之间的碰撞。不过,在测试游戏时,我注意到有些情况下,球会反弹,即使它没有与实际精灵的位置发生碰撞,比如球拍顶部和两侧都有2-3厘米的距离。我怀疑这是因为多边形的形状和精灵的x和y比例不同。所以我的问题是,如何将身体的大小设置为与缩放的精灵相同?我试过这样的方法:

p1Shape.SetAsBox(190 / 2 / p1.contentSize.width/PTM_RATIO/2, 58 / 2 / p1.contentSize.height/PTM_RATIO/2);

但是碰撞被忽略了,好像尸体根本不在那里。那么,如果已经缩放,如何使我的桨体与桨精灵的大小相同呢?

我不是100%确定,但我想我在进一步研究后找到了答案。下面是我如何设置身体形状的:

p1Shape.SetAsBox(p1.contentSize.width/PTM_RATIO/2 * p1.scaleX, p1.contentSize.height/PTM_RATIO/2 * p1.scaleY);
我不能肯定这是正确的解决方案,因为我没有启用调试绘图,我还不能确定如何使它工作,但从尝试在我的游戏上运行一些测试后的冲突来看,这似乎解决了我的问题。如果还有其他人认为有更正确的方法,请告诉我。谢谢