0

プログラムで作成した形状をロードする GB2ShapeCache と呼ばれるプログラムPhysics Editorに関連付けられたクラスがあります。現在、形状のスケールをその場で変更することはできないことに気付きました。そのため、物理エディタで作成した形状のフィクスチャをスケールできるようにしたいと考えています。アプリの 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 に答える