2013-07-21 50 views
1

我有一個使用CCSpriteFrameCache的動畫精靈,代表我的遊戲角色。我想添加一個文本標籤作爲這個精靈的子節點來表示(動態)字符名稱,但是我遇到了'CCSprite沒有使用相同的紋理ID'的複雜問題。由於文本是動態的,因此我無法將其包含在角色正在使用的精靈表中。將這些文字疊加到我的角色上的最佳方法是什麼?使用CCSpriteFrameCache將標籤添加到動畫精靈

回答

1

我傾向於爲此使用CCNode派生,它也實現了RGBA協議。您可以從節點內播放動畫,並將標籤添加到節點(以及其他健身欄),然後移動節點,使其可見(或不可見),使用一些動畫,如淡入淡出整個內容。

0

在此上下文中繼承的構成是正確的。

你可以看到我的代碼應該是你自己實現的模板。

@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