2012-12-04 2 views
0

나는 레이어와 그 자식을 주어진 불투명도로 희미 해지는 방법을 알아 내려하고있다. 이것이 내가하는 일이다.CCLayerColor와 그 자식을 주어진 불투명도로 사라지게하는 방법은 무엇입니까? Cocos2d

- (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]]; 
    } 

하지만 이것은 아무 것도하지 않습니다. 레이어를 설정 한 파란색을 보려면 배경 스프라이트를 제거한 다음 파란색 배경을 만들어야합니다. 그래서 제 질문은 왜 모든 계층의 어린이들을 페이드 아웃하지 않는 것입니까?

답변

2

불투명도 속성이 하위 항목으로 전파되지 않습니다. (실제로 테스트 해 보지 않았다,이 컴파일하지만 작동합니다)를 CCLayerColor을 확장 :

// 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; 
} 

편집 : 당신이 원하는 경우 setOpacity 방법을 대체 할 수 있습니다. 그냥하는 .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]; 
} 
+0

내가 잘못 알고 있었다 추측, I cocos2d 포럼에서 조치가 모든 계층 하위에 적용될 것이라고 알려졌다. – Stephen

+0

그래서이 코드는 어디에 넣을까요? – Stephen

+0

위의 코코스 버전 2를보고 있는데, 불투명도가 전파되지 않았습니다. 나는 이것이 자신의 클래스 중 하나라고 가정하고, 어떻게 든 CCNode를 확장합니다. 그냥 iVar를 추가하고 .m 파일에 코드를 추가하면됩니다 (클래스 구현). 위의 코드는 CCNode 파생물을위한 것입니다. 수업이 CCColorLayer를 확장합니까? – YvesLeBorg

3

를 재귀 적으로 잘 렌더링하지 않는 아이들의 불투명도 ("불투명 중복"효과)를 설정.

노드의 전체 계층 구조를 "전체적으로"페이드하고 싶다면 CCRenderTexture을 사용하면 노드 그래프를 렌더링하고 단일 이미지로 사라지게 할 수 있습니다.

자녀가 어떻게 든 움직이는 경우 CCRenderTexture을 자주 (상당히 CPU가 많이 드는) 업데이트해야합니다. 여기

자세한 내용 :적인 Cocos2D-X V3 틱 (나는 V3.4를 사용하고) 현재로 http://2sa-studio.blogspot.com/2013/01/fading-node-hierarchy-with.html

+0

마지막으로 이것을 사용했습니다. +1 – Jonny

4

; 당신이 Layer에 여러 Sprite의를 추가하는 경우 당신은 지금 불투명도가 다음 명령을 사용하여 각각의 아이들에게 아래로 케스케이드 될 것인지를 나타 내기 위해 레이어에 플래그를 설정할 수 있습니다

local layer = cc.Layer:create() 
layer:addChild(cc.Sprite("hero-dude.png")) 
layer:setCascadeOpacityEnabled(true) 
layer:runAction(cc.FadeTo:create(0.5, 127)) 
관련 문제