2013-07-21 2 views
1

나는 내 게임 캐릭터를 나타내는 CCSpriteFrameCache를 사용하여 애니메이션 스프라이트를 가지고 있습니다. 이 스프라이트의 자식으로 텍스트 레이블을 추가하여 (동적) 문자 이름을 나타내려고하지만 'CCSprite가 동일한 텍스처 ID를 사용하지 않습니다'라는 문제가 발생합니다. 텍스트가 동적이기 때문에 캐릭터가 사용하는 스프라이트 시트에 텍스트를 포함 할 수 없습니다. 내 캐릭터에게이 텍스트 오버레이를 가져 오는 가장 좋은 방법은 무엇입니까?CCSpriteFrameCache로 애니메이션 스프라이트에 라벨 추가하기

답변

1

나는 이것을 위해 CCNode 파생물을 사용하는 경향이 있으며, RGBA 프로토콜도 구현합니다. 노드 내부에서 애니메이션을 재생하고 노드에 레이블을 추가 한 다음 (상태 표시 줄과 같은 다른 노드와 마찬가지로) 노드를 이동하거나 보이게하거나 보이지 않게 페이드 인 및 페이드 아웃과 같은 애니메이션을 사용할 수 있습니다 전체 내용.

0

상속을 통한 합성은이 컨텍스트에서 true입니다.

내 코드는 스스로 구현할 수있는 템플릿이어야합니다.

@interface Player : CCNode 

+ (instancetype)playerWithName:(NSString*)name sprite:(CCSprite*)sprite 
- (id)initWithName:(NSString*)name sprite:(CCSprite*)sprite; 

@property (nonatomic, retain) CCSprite* sprite; 
@property (nonatomic, copy) NSString* name; 

@end 

@implementation Player { 
    BOOL _nameLabelAdded; 
    BOOL _spriteAdded; 
} 

#define LABEL_NAME_TAG 0e1 

@synthesize sprite = _sprite, name = _name; 

+ (instancetype)playerWithName:(NSString*)name sprite:(CCSprite*)sprite { 
    return [[[self alloc] initWithName:name sprite:sprite] autorelease]; 
} 

- (id)initWithName:(NSString*)name sprite:(CCSprite*)sprite { 
    if (self = [super init]) { 
     //NOT TESTED.. 
     self.name = name; 
     self.sprite = sprite; 
    } 
    return self; 
} 

- (void)setSprite:(CCSprite*)theSprite { 
    if (theSprite != _sprite) { 
     [_sprite release]; 
     _sprite = [theSprite retain]; 

     if (!_spriteAdded) { 
      /* initialize position etc here */ 
      [self addChild:_sprite]; 
      _spriteAdded = YES; 
     } 

    } 
} 

- (void)setName:(NSString*)theName { 
    if (![_name isEqualToString:theName]) { 
     [_name release]; 
     _name = [theName copy]; 

     if (![_name isEqualToString:@""]) { 
      CCLabelTTF* name_label; 
      if (!_nameLabelAdded) { 
       name_label = [CCLabelTTF labelWithString:_name]; 
       /* init the name_label */ 
       [self addChild:name_label z:1 tag:LABEL_NAME_TAG]; 
       _nameLabelAdded = YES; 
      } else { 
       name_label = (CCLabelTTF*)[self childWithTag:LABEL_NAME_TAG]; 
       name_label.text = name; 
      } 
     } 

    } 
} 

@end 
0

마지막으로 출시 된 게임에서 이러한 상황이 발생했습니다.

이 문제를 해결하는 가장 좋은 방법은 부모 노드를 만들고 레이블과 스프라이트를 자식으로 추가하는 것입니다. 서로 간섭하지 않고 두 위치의 위치를 ​​조정할 수 있기 때문에 주로 노드를 개별적으로 관리하는 것이 좋습니다.

노드 계층 구조 :

- Node parent 
    - Sprite with CCSpriteFrameCache 
    - Label 
관련 문제