-1

按照突破游戏的教程,我用自己的身体创建了 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);
}

创建身体后,我创建了一个更新方法,它使用接触侦听器检测我的球拍和球之间的碰撞。这可以正常工作,但是,我在测试游戏时注意到,即使球没有与实际精灵的位置发生碰撞,例如球拍的顶部和侧面大约 2-3 厘米,球也会弹跳。我怀疑这是因为我的多边形的形状和我的精灵的 scale-x 和 -y 不同。所以我的问题是,如何将身体的大小设置为与缩放的精灵相同?我试过类似的东西:

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

但是碰撞被忽略了,就好像身体根本不存在一样。那么,如果已缩放,如何使桨的 b2body 与桨精灵的大小相同?

4

1 回答 1

-1

我不是 100% 确定,但我想我经过更多研究后想通了。这是我设置身体形状的方法:

p1Shape.SetAsBox(p1.contentSize.width/PTM_RATIO/2 * p1.scaleX, p1.contentSize.height/PTM_RATIO/2 * p1.scaleY);

我不能肯定地说这是正确的解决方案,因为我没有启用调试绘制,我还不能弄清楚如何让它工作,但在尝试对我的游戏运行一些测试后从碰撞中判断,这似乎解决了我的问题。如果还有其他人可能认为有更正确的方法可以做到这一点,请告诉我。谢谢

于 2013-03-07T09:03:41.823 回答