不能改变Cocos2d-x MenuItemToggle元素的不透明度

Cannot change opacity of Cocos2d-x MenuItemToggle elements

本文关键字:不透明度 元素 MenuItemToggle 能改变 Cocos2d-x 不能      更新时间:2023-10-16

我想确定为什么不透明度不影响CCMenuItemToggle项目?当直接在对象上调用setOpacity()以及调用诸如FadeTo()或降低其父对象的不透明度等操作时,都是如此。

我使用Cocos2dx v2.2.6和v3.8.1进行了测试,两者都是相同的。

auto item1 = MenuItemToggle::createWithCallback(CC_CALLBACK_1(HelloWorld::menuCallback, this),
    MenuItemImage::create("CloseNormal.png", "CloseNormal.png"),
    MenuItemImage::create("CloseSelected.png", "CloseSelected.png"),
    nullptr);
// create menu, it's an autorelease object
auto menu = Menu::create(item1, NULL);
menu->setPosition(256, 256);
this->addChild(menu, 1);
// Nothing I do to try and make 'item1' set to 0% opacity works. It is always 100% opaque.
menu->setCascadeOpacityEnabled(true);
menu->setOpacity(0.0);
item1->setOpacity(0.0);
item1->getParent()->setCascadeOpacityEnabled(true);

经过进一步的分析,我发现在MenuItemToggle本身上调用setCascadeOpacityEnabled(true)需要受不透明度的影响(包括通过父菜单容器设置不透明度时)。这种行为偏离了其他CCMenuItem类,使我感到困惑。

为了减轻对每个切换项调用SetCascadeOpacityEnabled(true)的需要,可以在主CCMenuItem::initWithTarget构造函数中设置选项。例如,

bool CCMenuItem::initWithTarget(CCObject *rec, SEL_MenuHandler selector)
{
    setAnchorPoint(ccp(0.5f, 0.5f));
    m_pListener = rec;
    m_pfnSelector = selector;
    m_bEnabled = true;
    m_bSelected = false;
    // Make sure opacity and color values cascade to children
    this->setCascadeColorEnabled(true);
    this->setCascadeOpacityEnabled(true);
    return true;
}