0

Cocos2d を使って太い円を描く:

glLineWidth(20);
ccDrawCircle(self.ripplePosition, _radius, 0, 50, NO);

しかし、これが表示されます (4 つの異なるセグメントから作成されているように見えることに注意してください)。

http://i.stack.imgur.com/jYW4s.png

セグメント数を増やして値を大きくしようとしましたが、結果は同じです。

これは Cocos2D のバグですか? 「完璧な」円を達成する方法についてのアイデアはありますか?

以下は、cocos2d 2.0rc2 からの ccDrawCircle の実装です。

void ccDrawCircle( CGPoint center, float r, float a, NSUInteger segs, BOOL drawLineToCenter)
{
lazy_init();

int additionalSegment = 1;
if (drawLineToCenter)
    additionalSegment++;

const float coef = 2.0f * (float)M_PI/segs;

GLfloat *vertices = calloc( sizeof(GLfloat)*2*(segs+2), 1);
if( ! vertices )
    return;

for(NSUInteger i = 0;i <= segs; i++) {
    float rads = i*coef;
    GLfloat j = r * cosf(rads + a) + center.x;
    GLfloat k = r * sinf(rads + a) + center.y;

    vertices[i*2] = j;
    vertices[i*2+1] = k;
}
vertices[(segs+1)*2] = center.x;
vertices[(segs+1)*2+1] = center.y;

[shader_ use];
[shader_ setUniformForModelViewProjectionMatrix];    
[shader_ setUniformLocation:colorLocation_ with4fv:(GLfloat*) &color_.r count:1];

ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );

glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segs+additionalSegment);

free( vertices );

CC_INCREMENT_GL_DRAWS(1);
}
4

1 に答える 1

1

ccDrawCircleのわずかに変更されたバージョンを使用しましたが、これは非常にうまく機能します(スプライトを使用してサイズを変更するよりもはるかに優れたパフォーマンスを発揮します)。

void ccDrawDonut( CGPoint center, float r1, float r2, NSUInteger segs)
{
    lazy_init();

    const float coef = 2.0f * (float)M_PI/segs;

    GLfloat *vertices = calloc( sizeof(GLfloat)*4*segs+4, 1);
    if( ! vertices )
        return;

    for(NSUInteger i = 0;i <= segs; i++) {
        float rads = i*coef;
        GLfloat j1 = r1 * cosf(rads) + center.x;
        GLfloat k1 = r1 * sinf(rads) + center.y;
        vertices[i*4] = j1;
        vertices[i*4+1] = k1;

        rads+= coef/2;
        GLfloat j2 = r2 * cosf(rads) + center.x;
        GLfloat k2 = r2 * sinf(rads) + center.y;

        vertices[i*4+2] = j2;
        vertices[i*4+3] = k2;
    }

    [shader_ use];
    [shader_ setUniformForModelViewProjectionMatrix];
    [shader_ setUniformLocation:colorLocation_ with4fv:(GLfloat*) &color_.r count:1];

    ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );

    glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei) 2*segs+2);

    free( vertices );

    CC_INCREMENT_GL_DRAWS(1);
}
于 2012-06-18T05:37:22.687 に答える