cocos2d で黒丸を描くことはできますか? drawCircle() 関数を使用してアウトライン化された円を作成できますが、特定の色で塗りつぶす方法はありますか? おそらく、純粋な OpenGL を使用して?
6 に答える
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 を 参照してください。
これは、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 );
}
調べてください:
- CGContextAddArc
- CGContextFillPath
これらにより、OpenGL を必要とせずに円を塗りつぶすことができます
私もこれを疑問に思っていますが、実際にはそれを達成していません。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 コンテキストを作成することができます。
したがって、あなたがすることは次のとおりです。
- Quartz の CGImageRef コンテキストを作成する
- 石英でこの画像に描画します
- この CGImageRef で UIImage を初期化します
- その画像で初期化された Texture2D を作成します
- CocosNode のテクスチャをその Texture2D インスタンスに設定します
問題は、これが十分に高速かどうかです。これらすべての手順を実行するのではなく、CocosNode から直接 CGImageRef を取得してそこに描画できればと思いますが、それを行う方法をまだ見つけていません (そして、私はこれについて初心者のようなものです)。そのため、実際にどこかにたどり着くのは難しいです)。
以下、この方法を使用しました。
glLineWidth(2);
for(int i=0;i<50;i++){
ccDrawCircle( ccp(s.width/2, s.height/2), i,0, 50, NO);
}
for ループで複数の円を作成し、塗りつぶされた円のように見えます。