GB2ShapeCache形状比例? (物理编辑)[Box2D]

时间:2012-09-03 06:28:57

标签: ios cocos2d-iphone box2d scale game-physics

有一个与程序 物理编辑器 相关联的类,名为GB2ShapeCache,它加载我在程序中创建的形状。我注意到目前无法动态改变形状的比例,所以我希望能够缩放我在物理编辑器中制作的形状的灯具。现在我的应用程序中的CCSprite的规模可以是随机的,所以目前在addShapesWithFile方法中,我为多边形做这个:

vertices[vindex].x = (offset.x * sprite.scaleX) / ptmRatio_;
vertices[vindex].y = (offset.y * sprite.scaleY) / ptmRatio_;

这适用于圈子:

circleShape->m_radius = ([[circleData objectForKey:@"radius"] floatValue] / ptmRatio_) *sprite.scale;

我也改变了方法,以便我可以传入我的精灵,这样我就可以得到缩放:

-(void) addShapesWithFile:(NSString*)plist forSprite:(CCSprite *)sprite

这样我就可以传入我的精灵,这样我就可以获得比例。

然而,我发现这是低效的,因为我不应该在我的plist中重新加载我的所有形状,因为它们已被添加。

那么有什么方法可以做我现在正在做的事情但是在addFixturesToBody方法中呢?这样我就不会重新创建已添加的plist形状,只有在准备好添加到我的身体时才会缩放灯具。

如果有人需要查看更多代码或需要更多信息,请随时提问。我知道这个问题必须简单!!!

谢谢!

1 个答案:

答案 0 :(得分:4)

我建议在addFixturesToBody方法中实现它。 (见https://github.com/AndreasLoew/GBox2D/blob/master/GBox2D/GB2ShapeCache.mm

尝试下面的方法,这应该根据它们所用的精灵来缩放形状。只需传入你的CCSprite,这个方法将处理剩下的工作。

- (void)addFixturesToBody:(b2Body*)body forShapeName:(NSString*)shape forSprite:(CCSprite*)sprite {
    BodyDef *so = [shapeObjects_ objectForKey:shape];
    assert(so);

    FixtureDef *fix = so->fixtures;

    if ((sprite.scaleX == 1.0f) && (sprite.scaleY == 1.0f)) {
        // simple case - so do not waste any energy on this
        while(fix) {
            body->CreateFixture(&fix->fixture);
            fix = fix->next;
        }
    } else {
        b2Vec2 vertices[b2_maxPolygonVertices];
        while(fix) {
            // make local copy of the fixture def
            b2FixtureDef fix2 = fix->fixture;

            // get the shape
            const b2Shape *s = fix2.shape;

            // clone & scale polygon
            const b2PolygonShape *p = dynamic_cast<const b2PolygonShape*>(s);
            if(p)
            {
                b2PolygonShape p2;
                for(int i=0; i<p->m_vertexCount; i++)
                {
                    vertices[i].x = p->m_vertices[i].x * sprite.scaleX;
                    vertices[i].y = p->m_vertices[i].y * sprite.scaleY;
                }
                p2.Set(vertices, p->m_vertexCount);
                fix2.shape = &p2;
            }

            // clone & scale circle
            const b2CircleShape *c = dynamic_cast<const b2CircleShape *>(s);
            if(c) {
                b2CircleShape c2;
                c2.m_radius = c->m_radius * sprite.scale;
                c2.m_p.x = c->m_p.x * sprite.scaleX;
                c2.m_p.y = c->m_p.y * sprite.scaleY;
                fix2.shape = &c2;
            }

            // add to body
            body->CreateFixture(&fix2);
            fix = fix->next;
        }    
    }    
}