【求解答】cocos2dx 3.2 绘图问题

void WidgetNode::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(WidgetNode::onDraw, this, transform, flags);
    renderer->addCommand(&_customCommand);
}

void WidgetNode::onDraw(const Mat4 &transform, uint32_t flags)
{
    Director* director = Director::getInstance();
    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform);

    //draw
    CHECK_GL_ERROR_DEBUG();
    if(m_state == 0)
    {
        glLineWidth( 5.0f );
        DrawPrimitives::setDrawColor4B(255,0,0,255);
        DrawPrimitives::drawLine( VisibleRect::leftTop(), VisibleRect::rightBottom() );
    }
    else if (m_state == 1)
    {
        ……
    }
    else
    {
        this->removeAllChildren();
        auto needNode = WidgetNode::drawNeedNode();
        this->addChild(needNode);
    }

    CHECK_GL_ERROR_DEBUG();

    //end draw
    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}

```


这里我是想作为一个公共的入口,根据传进来的不同参数画不同的图形。
有一个比较复杂的,且根据不同状态位置、旋转角度会有所不同的图形,我想把这个图形做成一个Node,不然每次都要计算坐标太麻烦了,需要的时候addChild进来,这样直接setPosition()、setRotation()就行,但结果这样做这个needNode 里的内容会延后一帧才显示出来。
另外,有些状态下可能会显示数字,而这个数字是根据一个全局变量显示的,这个全局变量随时会改变,那么这个数字也要相应改变,一开始也是打算像上面这样做的,但好像也会延后一帧。
请问有什么好的方法么?

求高手解惑啊

一帧时间那么短,能感觉出来差异吗

可能不是一帧,但总之用Node画出来的和其他直接画出来的内容出现的时机,可以很明显看到Node节点上的内容延后出现,要是一同出现全体延误个0.x秒那都无所谓,关键是有的已经出现而有的过了一下才出现,感觉不怎么好

this->removeAllChildren();
auto needNode = WidgetNode::drawNeedNode();
this->addChild(needNode);

这个不应该放在onDraw方法里再添加吧,onDraw方法已经是在渲染当前帧的所有绘画了,你这时候添加的node就是要延迟一帧显示,要到下一帧才会将node添加到渲染队列里

所以如果要实现我上面说的要求有什么好的办法么?

你可以在设置m_state 的值时就判断添加node

这样就要在两处都要判断了,感觉有点臃肿,很不优雅,真的不能实现只在一处做处理了么:6:

从逻辑上你就不应该把对node的操作放在onDraw里边判断,onDeaw是渲染时候统一调用的方法,尽量只执行和渲染相关的操作

可是像画数字这些只能用Node来实现吧

node可以有其他方法来做这些操作啊