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

时间:2013-07-21 06:18:05

标签: iphone ios objective-c cocos2d-iphone

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

3 个答案:

答案 0 :(得分:1)

我倾向于使用CCNode衍生物来实现RGBA协议。您可以从节点内部播放动画,并将标签添加到节点(以及其他类似健康栏),然后移动节点,使其可见(或不显示),使用一些动画,如淡入和淡出整个内容。

答案 1 :(得分: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 

答案 2 :(得分:0)

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

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

节点层次结构:

- Node parent
  - Sprite with CCSpriteFrameCache
  - Label