cocos2dx 3d extension UILabel问题

在一个Scene 有2个layer: bg_layer, 3d_layer
它们都是scene的子节点

3d_layer 一个是绑定了 Camera

bg_layer 上有2个控件 一个是sprite 另一个是UILabel

然后移动 bg_layer, sprite会动, UILabel不动在原来的位置

去掉Camera 就正常了

有人遇到相同的bug么 怎么解决?


还有个问题 就是bg_layer 2d 按钮类的控件 点击位置都是不对的这是怎么回事

遇到过类似,两个相机下,给UI加action无效的问题。

那怎么解决呢?

local scene = class("3dscene", function()
    return display.newScene("3dscene")
end)

local currentLayer

function scene:ctor()
    self._bg = display.newSprite("_bg.png")
        :align(display.CENTER_BOTTOM, display.cx, 0)
        :addTo(self)

    currentLayer = cc.Layer:create()
    self:addChild(currentLayer)

    self:_setCamera()
end

function scene:setUILayer()
    txt = cc.ui.UILabel.new({
            UILabelType = cc.ui.UILabel.LABEL_TYPE_TTF,
            text = "test",
            size = 30,
            })
        :align(display.CENTER_BOTTOM, display.width/2, display.height/2)
        :addTo(self.table_bg)
end

function scene:_setCamera()
    self.camera_ = cc.Camera:createPerspective(60.0, display.width/display.height, 40.0, 500.0)
    self.camera_:setGlobalZOrder(10)
    self.camera_:addTo(currentLayer)

    local transformMat = self._bg:getWorldToNodeTransform()
    local newFaceDir = cc.vec3normalize({x = -transformMat,y = -transformMat, z = -transformMat})
    local pos3D = self._bg:getPosition3D()
    pos3D.z = pos3D.z + 90
    initCameraPosition = cc.vec3(pos3D.x, pos3D.y - 120, pos3D.z)

    self.camera_:setPosition3D(initCameraPosition)
    pos3D = self._bg:getPosition3D()
    self.camera_:lookAt(cc.vec3(pos3D.x + newFaceDir.x * 50, 
                                pos3D.y + newFaceDir.y * 50,
                                pos3D.z + newFaceDir.z * 50), cc.vec3(0,1,0))
end


```

代码大概是这样的

加我QQ,我把改的代码发你试试。

已解决 把ccnode.cpp的代码node::visit改为下面的就可以了

void Node::visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags)
{
    // quick return if not visible. children won't be drawn.
    if (!_visible)
    {
        return;
    }

    bool visibleByCamera = isVisitableByVisitingCamera();
    
    // If current node is not visited by camera, then don't process parent flags.
    // Note: if the node can be visited by two camera, some flag
    //       such as _transformUpdated or _contentSizeDirty will
    //       be reset by first visiting camera, it will be case
    //       some problem in second camera.
    uint32_t flags = parentFlags;
    if(visibleByCamera)
        flags = processParentFlags(parentTransform, parentFlags);

    // IMPORTANT:
    // To ease the migration to v3.0, we still support the Mat4 stack,
    // but it is deprecated and your code should not rely on it
    _director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    _director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform);
    
    int i = 0;

    if(!_children.empty())
    {
        sortAllChildren();
        // draw children zOrder < 0
        for( ; i < _children.size(); i++ )
        {
            auto node = _children.at(i);

            if (node && node->_localZOrder < 0)
                node->visit(renderer, _modelViewTransform, flags);
            else
                break;
        }
        // self draw
        if (visibleByCamera)
            this->draw(renderer, _modelViewTransform, flags);

        for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)
            (*it)->visit(renderer, _modelViewTransform, flags);
    }
    else if (visibleByCamera)
    {
        this->draw(renderer, _modelViewTransform, flags);
    }

    _director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    
    // FIX ME: Why need to set _orderOfArrival to 0??
    // Please refer to https://github.com/cocos2d/cocos2d-x/pull/6920
    // reset for next frame
    // _orderOfArrival = 0;
}


```