15

cocos2d で黒丸を描くことはできますか? drawCircle() 関数を使用してアウトライン化された円を作成できますが、特定の色で塗りつぶす方法はありますか? おそらく、純粋な OpenGL を使用して?

4

6 に答える 6

21

DrawingPrimitives.m で、drawCricle でこれを変更します。

glDrawArrays(GL_LINE_STRIP, 0, segs+additionalSegment);

に:

glDrawArrays(GL_TRIANGLE_FAN, 0, segs+additionalSegment);

OpenGL プリミティブの詳細については、http: //www.informit.com/articles/article.aspx? p=461848 を 参照してください。

代替テキスト

于 2009-07-26T19:16:12.213 に答える
2

これは、ccDrawCircle() をわずかに変更して、円の任意のスライスを描画できるようにするものです。これを CCDrawingPrimitives.m に貼り付け、メソッド ヘッダー情報も CCDrawingPrimitives.h に追加します。

パラメータ: a: ラジアン単位の開始角度、d: ラジアン単位の角度のデルタまたは変化 (2*M_PI完全な円に使用)

変更はコメントされています

void ccDrawFilledCircle( CGPoint center, float r, float a, float d, NSUInteger totalSegs)
{
    int additionalSegment = 2;

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

    NSUInteger segs = d / coef;
    segs++; //Rather draw over than not draw enough

    if (d == 0) return;

    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;

        //Leave first 2 spots for origin
        vertices[2+ i*2] = j * CC_CONTENT_SCALE_FACTOR();
        vertices[2+ i*2+1] =k * CC_CONTENT_SCALE_FACTOR();
    }
    //Put origin vertices into first 2 spots
    vertices[0] = center.x * CC_CONTENT_SCALE_FACTOR();
    vertices[1] = center.y * CC_CONTENT_SCALE_FACTOR();

    // Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
    // Needed states: GL_VERTEX_ARRAY, 
    // Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY   
    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    glVertexPointer(2, GL_FLOAT, 0, vertices);
    //Change to fan
    glDrawArrays(GL_TRIANGLE_FAN, 0, segs+additionalSegment);

    // restore default state
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);    

    free( vertices );
}
于 2011-07-06T22:12:20.353 に答える
1

調べてください:

  • CGContextAddArc
  • CGContextFillPath

これらにより、OpenGL を必要とせずに円を塗りつぶすことができます

于 2009-07-05T12:02:28.363 に答える
1

私もこれを疑問に思っていますが、実際にはそれを達成していません。Grouchal が上でヒントした CGContext のものを使用してみましたが、画面に何も描画できません。これは私が試したことです:

-(void) draw
{
    [self makestuff:UIGraphicsGetCurrentContext()]; 
}

-(void)makestuff:(CGContextRef)context
{
    // Drawing lines with a white stroke color
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
    // Draw them with a 2.0 stroke width so they are a bit more visible.
    CGContextSetLineWidth(context, 2.0);

    // Draw a single line from left to right
    CGContextMoveToPoint(context, 10.0, 30.0);
    CGContextAddLineToPoint(context, 310.0, 30.0);
    CGContextStrokePath(context);

    // Draw a connected sequence of line segments
    CGPoint addLines[] =
    {
        CGPointMake(10.0, 90.0),
        CGPointMake(70.0, 60.0),
        CGPointMake(130.0, 90.0),
        CGPointMake(190.0, 60.0),
        CGPointMake(250.0, 90.0),
        CGPointMake(310.0, 60.0),
    };
    // Bulk call to add lines to the current path.
    // Equivalent to MoveToPoint(points[0]); for(i=1; i<count; ++i) AddLineToPoint(points[i]);
    CGContextAddLines(context, addLines, sizeof(addLines)/sizeof(addLines[0]));
    CGContextStrokePath(context);

    // Draw a series of line segments. Each pair of points is a segment
    CGPoint strokeSegments[] =
    {
        CGPointMake(10.0, 150.0),
        CGPointMake(70.0, 120.0),
        CGPointMake(130.0, 150.0),
        CGPointMake(190.0, 120.0),
        CGPointMake(250.0, 150.0),
        CGPointMake(310.0, 120.0),
    };
    // Bulk call to stroke a sequence of line segments.
    // Equivalent to for(i=0; i<count; i+=2) { MoveToPoint(point[i]); AddLineToPoint(point[i+1]); StrokePath(); }
    CGContextStrokeLineSegments(context, strokeSegments, sizeof(strokeSegments)/sizeof(strokeSegments[0]));
}

これらのメソッドは cocos ノード クラスで定義されており、サンプル コードからお借りした makestuff メソッド...

注: 任意の図形またはパスを描画して塗りつぶそうとしています。上記のコードは線を描画するだけであることは知っていますが、動作するようになるまで続行したくありませんでした。

編集:これはおそらくくだらない解決策ですが、これは少なくともうまくいくと思います.

各 CocosNode にはテクスチャ (Texture2D *) があります。Texture2D クラスは UIImage から初期化できます。UIImage は CGImageRef から初期化できます。Quartz lib の CGImageRef コンテキストを作成することができます。

したがって、あなたがすることは次のとおりです。

  1. Quartz の CGImageRef コンテキストを作成する
  2. 石英でこの画像に描画します
  3. この CGImageRef で UIImage を初期化します
  4. その画像で初期化された Texture2D を作成します
  5. CocosNode のテクスチャをその Texture2D インスタンスに設定します

問題は、これが十分に高速かどうかです。これらすべての手順を実行するのではなく、CocosNode から直接 CGImageRef を取得してそこに描画できればと思いますが、それを行う方法をまだ見つけていません (そして、私はこれについて初心者のようなものです)。そのため、実際にどこかにたどり着くのは難しいです)。

于 2009-07-23T16:34:31.037 に答える
-1

以下、この方法を使用しました。

glLineWidth(2);
for(int i=0;i<50;i++){
  ccDrawCircle( ccp(s.width/2,  s.height/2), i,0, 50, NO);
}

for ループで複数の円を作成し、塗りつぶされた円のように見えます。

于 2013-01-08T15:54:14.357 に答える