【问题标题】:cocos2d-x-3.0 draw vs onDrawcocos2d-x-3.0 draw vs onDraw
【发布时间】:2014-04-28 06:11:36
【问题描述】:

我正在使用 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?
}

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

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

编辑:

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

【问题讨论】:

    标签: cocos2d-x cocos2d-x-3.0


    【解决方案1】:

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

    在您的图层 .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);
    }
    

    【讨论】:

    • 很好,但请将MyLayer::onDraw 更改为MyLayer::onDrawPrimitives
    • 这是覆盖onDrawPrimitives 的唯一好处。在不陷入无效矩形和级联内部 onDraw 调用的情况下进行 Blitting 和填充是 cocos2d-x 游戏开发的吸引力之一。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      debugDraw我用draw方法这样可能会有帮助

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-01-29
          • 1970-01-01
          • 1970-01-01
          • 2014-01-08
          • 1970-01-01
          • 1970-01-01
          • 2014-10-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多