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