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

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

【问题讨论】:

    标签: iphone ios objective-c cocos2d-iphone


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-28
          • 2023-04-06
          • 2011-12-01
          相关资源
          最近更新 更多