【问题标题】:How can I draw something on the sprite not behind sprite我怎样才能在精灵上而不是在精灵后面画一些东西
【发布时间】:2015-10-17 10:05:09
【问题描述】:

我使用 cocos2dx v3.8,并成功绘制了覆盖绘制的东西,例如:

void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
    GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION );
    Director::getInstance()->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    box2dWorld->DrawDebugData();
    Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
//  super::draw(renderer, transform, flags);
}

但它总是在精灵后面。修改z-order后无法更改。

已解决

现在我可以修复 cocos2d v3.x box2d DrawDebugData 问题。 我粘贴了所有的 cocos2dx 解决代码。 v2:(简单,因为v2引擎opengl draw是每个单独的任务)

void Box2dManager::draw(){
    ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
    kmGLPushMatrix();
    box2dWorld->DrawDebugData();
    kmGLPopMatrix();
}

v3:(v3引擎用quence将draw commond推送到core,所以需要创建回调)

void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
    super::draw(renderer, transform, _transformUpdated);
    GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
    Director* director = Director::getInstance();
    CCASSERT(nullptr != director, "Director is null when seting matrix stack");
    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    _modelViewMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(Box2dManager::onDraw, this);
    renderer->addCommand(&_customCommand);
    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}

void Box2dManager::onDraw() {
    Director* director = Director::getInstance();
    CCASSERT(nullptr != director, "Director is null when seting matrix stack");
    Mat4 oldMV;
    oldMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewMV);
    box2dWorld->DrawDebugData();
    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, oldMV);
}

参考: http://discuss.cocos2d-x.org/t/box2d-debug-drawing-for-cocos2d-x-3-0/11912/2 http://blog.csdn.net/zszeng/article/details/50000757

【问题讨论】:

    标签: cocos2d-x box2d draw cocos2d-x-3.0


    【解决方案1】:

    现在我可以修复 cocos2d v3.x box2d DrawDebugData 问题。 我粘贴了所有的 cocos2dx 解决代码。 v2:(简单,因为v2引擎opengl draw是每个单独的任务)

    void Box2dManager::draw(){
        ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
        kmGLPushMatrix();
        box2dWorld->DrawDebugData();
        kmGLPopMatrix();
    }
    

    v3:(v3引擎用quence将draw commond推送到core,所以需要创建回调)

    void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
        super::draw(renderer, transform, _transformUpdated);
        GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
        Director* director = Director::getInstance();
        CCASSERT(nullptr != director, "Director is null when seting matrix stack");
        director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
        _modelViewMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
        _customCommand.init(_globalZOrder);
        _customCommand.func = CC_CALLBACK_0(Box2dManager::onDraw, this);
        renderer->addCommand(&_customCommand);
        director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    }
    
    void Box2dManager::onDraw() {
        Director* director = Director::getInstance();
        CCASSERT(nullptr != director, "Director is null when seting matrix stack");
        Mat4 oldMV;
        oldMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
        director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewMV);
        box2dWorld->DrawDebugData();
        director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, oldMV);
    }
    

    参考: http://discuss.cocos2d-x.org/t/box2d-debug-drawing-for-cocos2d-x-3-0/11912/2 http://blog.csdn.net/zszeng/article/details/50000757

    【讨论】:

    • 我必须使用_customCommand.init(_globalZOrder + 1); 来初始化自定义渲染命令,否则Box2d 相关的东西会在精灵后面渲染。有什么想法可以解决这个问题吗?我正在使用 cocos2d-x 3.10。
    【解决方案2】:

    您如何使用DrawNode 并将其添加为孩子?如果您要使用您在绘图树上管理的节点,则维护起来会更容易。

    auto myDrawing = DrawNode::create();
    myDrawing::drawRect(p1, p2, p3, Color4F(255, 255, 0, 255));
    myDrawing::setLineWidth(2)
    this->addChild(myDrawing); 
    

    【讨论】:

      【解决方案3】:
          virtual void draw (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform,uint32_t flags) override;
         cocos2d::CustomCommand _customCmd;
       void   onDraw(const cocos2d::Mat4 &transform, uint32_t flags);
      
      
      
      void linedraw:: draw(cocos2d::Renderer* renderer, const cocos2d::Mat4 &transform, uint32_t flags){
              //cocos2d::Layer::draw(renderer, transform, flags);
      
      
              _customCmd.init(1);
              _customCmd.func = CC_CALLBACK_0(linedraw::onDraw, this, transform, flags);
              renderer->addCommand(&_customCmd);
      
          }
      
              void  linedraw:: onDraw(const cocos2d::Mat4 &transform, uint32_t flags)
              {
      
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        • 2015-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多