有一个与程序 物理编辑器 相关联的类,名为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形状,只有在准备好添加到我的身体时才会缩放灯具。
如果有人需要查看更多代码或需要更多信息,请随时提问。我知道这个问题必须简单!!!
谢谢!
答案 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;
}
}
}