5

我正在使用 cocos2d-x v3.0 并且在一些测试项目中我正在通过覆盖Nodedraw方法进行一些自定义绘图,但是在 DrawPrimitives 示例中,只要他们执行以下操作:

void DrawPrimitivesTest::draw()
{
    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(DrawPrimitivesTest::onDraw, this);
    Director::getInstance()->getRenderer()->addCommand(&_customCommand);
}

void DrawPrimitivesTest::onDraw()
{
    // drawing code here, why?
}

从读取头文件和源文件看来,这可能是将渲染命令直接发送到渲染器的某种方式,对吗?

我应该使用这种方法进行自定义绘图吗?draw和有什么区别onDraw

编辑:

正如@Pedro Soares 所提到的,自从 Cocos2D-X 3.0 以来,您不能再覆盖draw()了。你必须draw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated)改用。

4

4 回答 4

10

cocos2d-x RC0 包上有一个示例,展示了如何在其他层之上使用 DrawPrimitives。

在您的 Layer .h 添加以下内容:

private:
    void onDrawPrimitives(const kmMat4 &transform, bool transformUpdated);
    CustomCommand _customCommand;

现在在 Layer 的 cpp 中,覆盖 layer draw 方法并包含 onDrawPrimitives 方法:

void MyLayer::onDrawPrimitives(const kmMat4 &transform, bool transformUpdated)
{
    kmGLPushMatrix();
    kmGLLoadMatrix(&transform);

    //add your primitive drawing code here
    DrawPrimitives::drawLine(ccp(0,0), ccp(100, 100));
}

void MyLayer::draw(Renderer *renderer, const kmMat4& transform, bool transformUpdated)
{
    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(MyLayer::onDrawPrimitives, this, transform, transformUpdated);
    renderer->addCommand(&_customCommand);
}
于 2014-03-28T22:34:32.647 回答
7

未来,cocos2d-x 3.x 渲染器将是多线程的,带有命令池。

draw方法调用的visit方法,以创建新命令。当命令由命令池执行时,onDraw被调用。此时,命令在单线程中执行,但在重载onDraw方法中,您应该假设它将在另一个线程中调用以简化将来的迁移。

于 2014-03-22T15:04:33.153 回答
0

我使用 draw 方法进行 debugDraw 像这样它可能会有所帮助

void HelloWorld::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
    Layer::draw(renderer, transform, flags);
    Director* director = Director::getInstance();
    GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION );
    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    world->DrawDebugData();
    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
于 2014-09-24T07:21:38.103 回答
0

draw() 表达式应该与基类函数相同。cocos 3.3rc的Node的draw方法是:virtual void draw(Renderer *renderer, const Mat4& transform, uint32_t flags);

于 2014-11-20T14:56:51.770 回答