第一步:
在CCDrawingPrimitives.加入如下方法:
/**画扇形***/
void drawSolidfanshaped( const Point& center, float radius, float angle, unsigned int segments, float scaleX, float scaleY);
void drawSolidfanshaped( const Point& center, float radius, float angle, unsigned int segments);
在CCDrawingPrimitives.cpp进行实现
void drawSolidfanshaped( const Point& center, float radius, float angle, unsigned int segments)
{
drawSolidfanshaped(center, radius, angle, segments, 1.0f, 1.0f);
}
void drawSolidfanshaped( const Point& center, float radius, float angle, unsigned int segments, float scaleX, float scaleY)
{
lazy_init();
const float coef = (float)angle/segments; //系数:一段有多少度,angle为弧度制,要先通过CC_DEGREES_TO_RADIANS()转化
GLfloat *vertices = (GLfloat*)calloc( sizeof(GLfloat)*2*(segments+2), 1); //分配内存空间
if( ! vertices )
return;
vertices[0] = center.x;
vertices[1] = center.y;
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+1)*2] = j; //x坐标
vertices[(i+1)*2+1] = k; //y坐标
}
/*vertices[(segments+1)*2] = center.x;
vertices[(segments+1)*2+1] = center.y;*/
s_shader->use();
s_shader->setUniformsForBuiltins();
s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1);
GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION );
#ifdef EMSCRIPTEN
setGLBufferData(vertices, sizeof(GLfloat)*2*(segments+2));
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0);
#else
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);
#endif // EMSCRIPTEN
glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) segments+1);
::free( vertices );
CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,segments+1);
}
第二步:
在自己创建的类重写如下方法:我的类是:Clock
在.h文件加入
public:
void draw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated);
protected:
void onDraw(const kmMat4 &transform, bool transformUpdated);
CustomCommand _customCommand;
在.cpp文件加入
void CLock::draw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated)
{
_customCommand.init(_globalZOrder);
_customCommand.func = CC_CALLBACK_0(CLock::onDraw, this, transform, transformUpdated);
renderer->addCommand(&_customCommand);
}
void CLock::onDraw(const kmMat4 &transform, bool transformUpdated)
{
DrawPrimitives::drawSolidfanshaped(Point(m_winSize.width/2,m_winSize.height/2),130,CC_DEGREES_TO_RADIANS(30),100);
}