如何在cocos2d-x中绘制填充有颜色的圆形?

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);
3个回答

3
CCDrawNode 类中,你可以绘制圆形、线条和多边形。
void drawDot(const CCPoint & pos,float  radius, const ccColor4F & color)

在给定位置绘制一个填充圆形,半径和颜色也要给定。

1

只需在CCDrawingPrimitives中添加一个新的方法。它与ccDrawCircle完全相同,只是glDrawArrays使用GL_TRIANGLE_FAN而不是GL_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);
 }

1

不确定从哪个cocos2d-x版本开始可用,但您应该有一种绘制实心圆的特定方法。

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

请查看夜间版CCDrawingPrimitives.cpp类。


谢谢您的回答,但是这个方法在3.0alpha0-pre版本中。 - Dhiral Pandya
好的,你可以尝试复制这个方法。主要区别应该是使用GL_TRIANGLE_FAN而不是GL_LINE_STRIP来调用glDrawArrays函数。 - ssantos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接