在一个Scene 有2个layer: bg_layer, 3d_layer
它们都是scene的子节点
3d_layer 一个是绑定了 Camera
bg_layer 上有2个控件 一个是sprite 另一个是UILabel
然后移动 bg_layer, sprite会动, UILabel不动在原来的位置
去掉Camera 就正常了
有人遇到相同的bug么 怎么解决?
在一个Scene 有2个layer: bg_layer, 3d_layer
它们都是scene的子节点
3d_layer 一个是绑定了 Camera
bg_layer 上有2个控件 一个是sprite 另一个是UILabel
然后移动 bg_layer, sprite会动, UILabel不动在原来的位置
去掉Camera 就正常了
有人遇到相同的bug么 怎么解决?
遇到过类似,两个相机下,给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;
}
```