0

有一个与名为 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*) 精灵

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

但是,我发现这效率低下,因为我不应该在我的 plist 中重新加载我的所有形状,因为它们已经添加了。

那么除了 addFixturesToBody 方法之外,有什么方法可以做我现在正在做的事情吗?这样我就不会重新创建已经添加的 plist 形状,我只会在准备好添加到我的身体时缩放固定装置。

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

谢谢!

4

1 回答 1

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;
        }    
    }    
}
于 2012-09-03T07:40:00.867 回答