我有一个使用 CCSpriteFrameCache 的动画精灵来代表我的游戏角色。我想添加一个文本标签作为这个精灵的子项来表示(动态)角色名称,但是我遇到了“CCSprite 没有使用相同的纹理 ID”的复杂情况。因为文本是动态的,所以我不能将它包含在角色正在使用的精灵表中。将此文本叠加到我的角色上的最佳方法是什么?
问问题
115 次
3 回答
1
我倾向于为此使用 CCNode 衍生产品,它也实现了 RGBA 协议。您可以从节点内部播放动画,并将标签添加到节点(以及其他类似健康栏),然后移动节点,使其可见(或不可见),使用一些动画,如淡入和淡出整个内容。
于 2013-07-21T12:32:56.767 回答
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
于 2013-07-21T15:09:22.277 回答
0
我在上次发布的游戏中遇到了这种情况。
解决这个问题的最好方法是创建一个父节点并将标签和精灵添加为子节点。最好分开管理节点,主要是可以调整两者的位置,不会互相干扰。
节点层次结构:
- Node parent
- Sprite with CCSpriteFrameCache
- Label
于 2013-07-22T22:16:23.820 回答