cocos2d-x画扇形

来源:互联网 发布:10年科比总决赛数据 编辑:程序博客网 时间:2024/04/27 23:06

第一步:

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



  

   


  












1 0
原创粉丝点击