4

私は cocos2d-x の初心者です。色付きの円を描画しようとしています。ネットで検索したところ、いくつかのコードが見つかりました。以下のコードを試しましたが、色の境界線で円を描くだけです。私の cocos2d-x バージョンは 2.1.5 で、Android に使用しています。また、このメソッドを使用して境界線の幅を変更しようとしました: glLineWidth(2); しかし、このメソッドは私の cocos2d-x にはありません。円に色を追加する方法と円の境界線の幅を変更する方法。

cocos2d::ccDrawColor4B(0, 255, 255, 255);
cocos2d::ccDrawColor4F(0, 255, 255, 255);
cocos2d::ccDrawCircle( ccp(100/2, 100/2), 50, CC_DEGREES_TO_RADIANS(90), 50, false);
4

3 に答える 3

3

CCDrawNodeクラスでは、円、線、多角形を描画できます。

void drawDot(const CCPoint & pos,float  radius, const ccColor4F & color)

指定された半径と色で、ある位置に塗りつぶし円を描画します

于 2013-09-30T09:21:57.537 に答える
1

どのcocos2d-xバージョンから利用できるかはわかりませんが、塗りつぶした円を描くための特定の方法が必要です.-

void drawSolidCircle( const Point& center, float radius, float angle, unsigned int segments, float scaleX, float scaleY);

毎晩のCCDrawingPrimitives.cppクラスを見てください。

于 2013-09-29T09:21:08.377 に答える
1

CCDrawingPrimitives に新しいメソッドを追加するだけです。の代わりに使用することをccDrawCircle除いて、と同じですglDrawArraysGL_TRIANGLE_FANGL_LINE_STRIP

ヘッダーに、次を追加します。

 void CC_DLL ccDrawSolidCircle( const CCPoint& center, float radius, float angle, unsigned int segments, bool drawLineToCenter);

.cpp ファイルに次を追加します。

 void ccDrawSolidCircle( const CCPoint& center, float radius, float angle, unsigned int segments, bool drawLineToCenter)
 {
lazy_init();

float scaleX = 1;
float scaleY = 1;

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

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

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

for(unsigned int i = 0;i <= segments; i++) {
    float rads = i*coef;
    GLfloat j = radius * cosf(rads + angle) * scaleX + center.x;
    GLfloat k = radius * sinf(rads + angle) * scaleY + center.y;

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

s_pShader->use();
s_pShader->setUniformsForBuiltins();
s_pShader->setUniformLocationWith4fv(s_nColorLocation, (GLfloat*) &s_tColor.r, 1);

ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );

 #ifdef EMSCRIPTEN
setGLBufferData(vertices, sizeof(GLfloat)*2*(segments+2));
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0);
 #else
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);
 #endif // EMSCRIPTEN
glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) segments+additionalSegment);

free( vertices );

CC_INCREMENT_GL_DRAWS(1);
 }
于 2013-10-07T17:39:11.167 に答える