使用 CCSpriteFrameCache 为动画精灵添加标签

Posted

技术标签:

【中文标题】使用 CCSpriteFrameCache 为动画精灵添加标签【英文标题】:Adding a label to an animated sprite with CCSpriteFrameCache 【发布时间】:2013-07-21 06:18:05 【问题描述】:

我有一个使用 CCSpriteFrameCache 的动画精灵来代表我的游戏角色。我想添加一个文本标签作为这个精灵的子元素来表示(动态)角色名称,但是我遇到了“CCSprite 没有使用相同的纹理 ID”的复杂情况。因为文本是动态的,所以我不能将它包含在角色正在使用的精灵表中。将此文本叠加到我的角色上的最佳方法是什么?

【问题讨论】:

【参考方案1】:

我倾向于为此使用 CCNode 衍生产品,它也实现了 RGBA 协议。您可以从节点内部播放动画,并将标签添加到节点(以及其他像健康栏),然后移动节点,使其可见(或不可见),使用一些动画,如淡入和淡出全部内容。

【讨论】:

【参考方案2】:

在这种情况下,组合优于继承。

您可以看到我的代码,它应该是您自己实现的模板。

@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 

【讨论】:

【参考方案3】:

我在上次发布的游戏中遇到过这种情况。

解决此问题的最佳方法是创建一个父节点并将标签和精灵添加为子节点。最好分开管理节点,主要是可以调整两者的位置,不会互相干扰。

节点层次结构:

- Node parent
  - Sprite with CCSpriteFrameCache
  - Label

【讨论】:

以上是关于使用 CCSpriteFrameCache 为动画精灵添加标签的主要内容,如果未能解决你的问题,请参考以下文章

你必须使用带有 CCSpriteFrameCache 的精灵表吗?

CCTexture2D CCSpriteBatchNode CCTextureCache CCSpriteFrameCache 分析

CCTexture2D CCSpriteBatchNode CCTextureCache CCSpriteFrameCache 分析

cocos2d-x-2.1.4用到CCSpriteFrameCache的时候,应该怎么初始化CCSprite* sprite呀?

cocos2dx-深度解析plist文件(游戏对象的数据如何从plist创建获取)

(21)纹理缓存(Texture Cache)