Cocos2d iphone 如何将CCLayerColor及其子对象褪色为给定的不透明度?Cocos2d
我试图找出如何将层及其子层淡入给定的不透明度。这就是我正在做的Cocos2d iphone 如何将CCLayerColor及其子对象褪色为给定的不透明度?Cocos2d,cocos2d-iphone,opacity,cclayer,Cocos2d Iphone,Opacity,Cclayer,我试图找出如何将层及其子层淡入给定的不透明度。这就是我正在做的 - (id)init { if( (self=[super initWithColor:ccc4(0, 0, 255, 255)] )) { CCSprite *background = [CCSprite spriteWithFile:@"LevelsBackGround.png"]; background.position = ccp([UISc
- (id)init
{
if( (self=[super initWithColor:ccc4(0, 0, 255, 255)] )) {
CCSprite *background = [CCSprite spriteWithFile:@"LevelsBackGround.png"];
background.position = ccp([UIScreen mainScreen].bounds.size.height * .5f ,160);
[self addChild:background];
CCSprite *text = [CCSprite spriteWithFile:@"SwipeText.png"];
text.position = ccp([UIScreen mainScreen].bounds.size.height *.5, 17);
[self addChild:text];
sceneText = [CCLabelTTF labelWithString:@"Yard" fontName:@"Baskerville-Bold" fontSize:20];
sceneText.position = ccp([UIScreen mainScreen].bounds.size.height *.5, 300);
sceneText.color = ccc3(172, 169, 164);
[self addChild:sceneText];
[self performSelector:@selector(LaunchLevel:) withObject:nil afterDelay:2.f];
}
- (void ) LaunchLevel: (id) sender {
[self runAction:[CCFadeTo actionWithDuration:.5 opacity:127]];
}
但这似乎没有任何作用。如果我移除背景精灵以查看图层设置为的蓝色,然后构建它,那么蓝色背景会完全按照它应该的那样褪色。所以我的问题是,为什么淡出所有子层都不起作用?不透明度属性不会传播到子层。如果需要,可以覆盖setOpacity方法:
// in your .h file, an iVar
GLubyte _opacity;
// in you .m, the overrides
- (void)setOpacity:(GLubyte)opacity {
for (id child in self.children) {
id <CCRGBAProtocol> opaqueChild = (id <CCRGBAProtocol>) child;
if ([opaqueChild respondsToSelector:@selector(setOpacity:)]) {
opaqueChild.opacity = opacity;
} else {
// you must decide here what to do for your own situation
// and the children you are likely to have in there
}
}
_opacity = opacity;
}
- (GLubyte)opacity {
return _opacity;
}
编辑:扩展此编译的CCLayerColor,并没有实际测试它,但应该可以工作。只需在.m文件中为类的实现添加以下内容:
- (void)setOpacity:(GLubyte)opacity {
for (id child in self.children) {
id <CCRGBAProtocol> opaqueChild = (id <CCRGBAProtocol>) child;
if ([opaqueChild respondsToSelector:@selector(setOpacity:)]) {
opaqueChild.opacity = opacity;
} else {
// you must decide here what to do for your own situation
// and the children you are likely to have in there
}
}
[super setOpacity:opacity];
}
递归设置子对象的不透明度不会很好地渲染不透明度重叠效果 如果要整体淡入整个节点层次,可以使用CCRenderTexture渲染节点图并将其淡入单个图像 而且,如果您的孩子以某种方式充满活力,那么您需要经常更新您的CCRenderTexture,这需要相当高的CPU成本
这里有更多详细信息:从Cocos2d-xv3开始,我使用的是v3.4;如果要向层添加多个精灵,现在可以在层上设置一个标志,指示不透明度应通过以下命令级联到其各自的子级:
local layer = cc.Layer:create()
layer:addChild(cc.Sprite("hero-dude.png"))
layer:setCascadeOpacityEnabled(true)
layer:runAction(cc.FadeTo:create(0.5, 127))
我猜我是被误导了,我在cocos2d论坛上被告知一个动作将应用于所有的层子。我正在看上面的cocos版本2,不透明性没有传播。我假设这是您自己的类之一,它以某种方式扩展了CCNode。只需添加一个iVar并将代码添加到.m文件中,以实现该类。上面的代码是针对CCNode派生的。你的类扩展了CCColorLayer吗?是的,我的类是CCLayerColor的一个子类。所以把这两个方法添加到你的CCLayerColor子类中。您不仅可以更改其子项的不透明度,还可以在其上使用不透明度操作CCFadeIn、CCFadeOut、CCFadeTo。只有一个改进-创建不透明子对象的数组,并添加您想要对图层的setOpacity:method做出反应的所有内容。在这种情况下,您不仅可以使儿童褪色,还可以使儿童的儿童褪色。最终,您可以使用此功能+1.