2009-07-04 11 views
15

cocos2dで塗りつぶした円を描くことは可能ですか? アウトラインサークルはdrawCircle()関数を使用して行うことができますが、特定の色で塗りつぶす方法はありますか?おそらく、純粋なOpenGLを使用して?iPhone用のcocos2dで円を描く方法

答えて

1

ルックへ:

  • CGContextAddArc
  • CGContextFillPath

これらは、私もこれを疑問に思うが、実際に達成していないあなたは、OpenGL

1

を必要とせずに円を埋めることができますしている。私はGrouchalが上でヒントしたCGContextを使ってみましたが、画面上に何かを描画することはできません。私がしようとしている :...

NOTE

-(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])); 
} 

をこれらの方法はココスノードクラスで定義されている、と私はコード例から借りmakestuff方法:これは私が試したものです形状やパスを描き、それを塗りつぶします。私は上のコードは線を引くだけであることを知っていますが、私はそれが動作するまで続けません。

EDIT: これはおそらくお粗末な解決策ですが、これは少なくともの仕事だと思います。

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

だから、何をするだろうことは次のとおりです。

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

質問には、これができるだけ速いのが問題です。あなたがCGImageRefをCocosNodeから直接取得してこれらのすべてのステップを実行するのではなく描画することができれば好きですが、まだこれを行う方法は見つけられていません(そして、実際にどこかに入るのは難しいです)。

21

In DrawingPrimitives。メートル、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

alt text

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); 
} 
-1

をコメントしています。

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

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

0

と呼ばれる新しい機能がcocos2d CCDrawingPrimitivesにあります。これを見ている人には、代わりにこのメソッドを使用してください。次に、cocos2dコードを混乱させる必要はありません。ちょうどインポートします。CCDrawingPrimitives.h