cocos2dx ui显示机制
实验1
1,a.addChild(b); a的宽高没变,还是自己的宽高。 层级添加 不会改变原层大小。
2.node.addChild(sprite);node的宽和高也没变 感觉2dx的显示不是树形结构。
然后改变node的透明度也不管用,node不是个显示类,感觉唯一的作用就是操作很多个sprite。一起改变位置
//sprite包含情况
void HelloWorld::testSpriteAdd()
{
auto sprite1 = Sprite::create("Images/CyanSquare.png");
sprite1->setPosition(160, 240);
log("sprite1 w,h %f %f",sprite1->getContentSize().width, sprite1->getContentSize().height);
auto node = Node::create();
node->addChild(sprite1);
node->setOpacity(255 / 2);
addChild(node, 0, 100);
log("node w,h %f %f", node->getContentSize().width, node->getContentSize().height);//0,0
}
实验2
感觉2dx中没有父改变,所有的子都改变的机制,只是单单改变你调用的那一个对象,下面的代码只有bomb1改变了透明度,他的子spr并没有改变
auto s = Director::getInstance()->getWinSize(); Node* node = Node::create(); Sprite* bomb1 = Sprite::create("bg.png"); node->addChild(bomb1); this->addChild(node); node->setOpacity(255 / 2); node->setPosition(Vec2(s.width/2,s.height/2)); auto spr = Sprite::create("a.png"); bomb1->addChild(spr); bomb1->setOpacity(255/3);//
那要整体改变一个node的透明读,然后他所有的子的透明度都变化应该怎么做呢?
void HelloWorld::testSetOpacity() { auto s = Director::getInstance()->getWinSize(); Node* node = Node::create(); node->setCascadeOpacityEnabled(true); Sprite* bomb1 = Sprite::create("bg.png"); node->addChild(bomb1); //auto spr = Sprite::create("a.png"); //bomb1->addChild(spr); this->addChild(node); node->setPosition(Vec2(s.width / 2, s.height / 2)); node->setOpacity(255/3); }
setCascadeOpacityEnabled 这个函数里面调用了
updateDisplayedOpacity 这个方法只是遍历了第一层孩子,没有检测孩子的孩子
void Node::updateDisplayedOpacity(GLubyte parentOpacity) { _displayedOpacity = _realOpacity * parentOpacity/255.0; updateColor(); if (_cascadeOpacityEnabled) { for(auto child : _children){ child->updateDisplayedOpacity(_displayedOpacity); } } }