zszen
zszen

Reputation: 1478

How can I draw something on the sprite not behind sprite

I use cocos2dx v3.8, and successful draw things with override draw like:

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

but It always behind the sprites. It can't change after modify z-order.

SOLVED

Now I can fix cocos2d v3.x box2d DrawDebugData problem. And I paste all the cocos2dx solve code. v2: (simple, because v2 engine opengl draw is each single task)

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

v3: (v3 engine push the draw commond to core with quence, so you need create a callback )

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

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

Upvotes: 1

Views: 434

Answers (3)

himanshu kalal
himanshu kalal

Reputation: 206

    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)
        {

            }

Upvotes: 0

zszen
zszen

Reputation: 1478

Now I can fix cocos2d v3.x box2d DrawDebugData problem. And I paste all the cocos2dx solve code. v2: (simple, because v2 engine opengl draw is each single task)

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

v3: (v3 engine push the draw commond to core with quence, so you need create a callback )

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

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

Upvotes: 1

Seivan
Seivan

Reputation: 689

How about you use a DrawNode and add it as a child? It would be easier to maintain if you were to use a node that you manage on the drawing tree.

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

Upvotes: 0

Related Questions