Objective c 从另一个类访问ccsprite

Objective c 从另一个类访问ccsprite,objective-c,ios,cocos2d-iphone,ccsprite,Objective C,Ios,Cocos2d Iphone,Ccsprite,在A.h中,我这样写 @interface A { CCSprite *loadingSprite; } - (void)getTag; @property (nonatomic, retain) CCSprite *loadingSprite; @end 然后在上午实施 @synthesize loadingSprite - (id)init { loadingSprite = [CCSprite spriteWithSpriteFrameName:@"loading-icon

在A.h中,我这样写

@interface A
{
  CCSprite *loadingSprite;
}

- (void)getTag;

@property (nonatomic, retain) CCSprite *loadingSprite;

@end
然后在上午实施

@synthesize loadingSprite

- (id)init
{
 loadingSprite = [CCSprite spriteWithSpriteFrameName:@"loading-icon1.png"];
 [loadingSprite setTag:111];
 [self addChild:loadingSprite];
}

- (void)getTag
{
 NSLog(@"%@ tag %d",[loadingSprite getChildByTag:111] , [loadingSprite getChildByTag:111].tag)
}
在另一个类上,我写入访问方法getTag

A *a = [[A alloc] init];
[a getTag];
但不幸的是,getTag中的NSLog显示:

(null) tag 0

如何正确地从另一个类访问ccsprite?谢谢

您正试图通过标签从精灵中获取孩子。你想得到这个雪碧。因此,如果您想使用
getChildByTag:
,请使用

[self getChildByTag: tag];
而不是

[yourSprite getChildByTag: tag];
将精灵添加到
self
时。只能从其父级通过标记获取子级

哦,改变你的init方法。重写父级的init时,应首先调用父级的方法

- (id) init
{
    self = [super init];

    if( self != nil )
    {
        // do your initialization here
    }

    return self
}

您正在尝试从精灵中通过标签获取child。你想得到这个雪碧。因此,如果您想使用
getChildByTag:
,请使用

[self getChildByTag: tag];
而不是

[yourSprite getChildByTag: tag];
将精灵添加到
self
时。只能从其父级通过标记获取子级

哦,改变你的init方法。重写父级的init时,应首先调用父级的方法

- (id) init
{
    self = [super init];

    if( self != nil )
    {
        // do your initialization here
    }

    return self
}

查看我的教程“访问场景层次结构中其他Cocos2D节点的策略”:

查看我的教程“访问场景层次结构中其他Cocos2D节点的策略”:

另一件事-您不必保留添加到类中的节点,因为当您使用
[self addChild:node]
并在释放基本节点时释放,因此最好使用
@property(非原子,赋值)CCSprite*loadingSprite;


您可以使用该属性从其他类访问节点—在您的示例中只需使用
a.loadingSprite
。总之,使用标记并不是访问节点的最佳解决方案,因为当您有很多节点和很多标记时,您可能很容易在其中丢失。

另一件事—您不必保留添加到clas中的节点s、 因为cocos2d在您使用
[self addChild:node]
时自动保留任何节点,在您释放基本节点时自动释放,所以最好使用
@property(nonatomic,assign)CCSprite*loadingSprite;


您可以使用该属性从其他类访问节点-在您的示例中只需使用
a.loadingSprite
。总之,使用标记并不是访问节点的最佳解决方案,因为当您有很多节点和很多标记时,您可能很容易在那里丢失。

啊,是的,如果我在类a的init方法末尾放置一个日志,那么g显示精灵及其标记。但是,当我从类B调用getTag方法时,它仍然显示null和零,我哪里出错了?在初始化中使用self.loadingSprite,而不仅仅是loadingSprite。并且不需要将其声明为retain。如果将其声明为retain,请不要忘记在处理中调用self.loadingSprite=nilloc method.so我将loadingSprite=[CCSprite spritewithpriteframename:@“load-icon1.png”;[loadingSprite setTag:111];更改为self.loadingSprite=[CCSprite spritewithpriteframename:@“load-icon1.png”;[self.loadingSprite setTag:111];仍然没有luckif(self=[super init])有点短。也许吧,但我的变量更容易阅读。至少,对我和我的同事来说。我总是喜欢更清晰的变量。啊,是的,如果我在类a的init方法的末尾放一个日志,日志会显示精灵和它的标记。但是,当我从类B调用getTag方法时,它仍然显示null和零,我哪里出错了?使用self.load在初始化中使用InSprite,而不仅仅是加载Prite。并且不需要将其声明为retain。如果将其声明为retain,请不要忘记在dealloc方法中调用self.LoadingPrite=nil。因此,我更改了LoadingPrite=[CCSprite SpriteWithPriteFrameName:@“loading-icon1.png”;[loadingSprite setTag:111];进入self.loadingSprite=[CCSprite spritewithpriteframename:@“load-icon1.png”];[self.loadingSprite setTag:111];仍然没有luckif(self=[super init])有点短。也许吧,但我的变体更容易阅读。至少对我和我的同事来说。我总是喜欢更清晰的变体。我想最好的方法是为正在使用的普通精灵创建一个单例类,这样你就不必反复初始化它,你也可以从任何地方获取/设置分配给该精灵的所有属性你想要。是的,最后我使用了单例。这有点太多了,但除了将精灵用作单例之外,我没有任何线索。我想最好的方法是为正在使用的普通精灵创建一个单例类,这样你就不必一次又一次地初始化它,你也可以从任何地方获取/设置分配给该精灵的所有属性想要。是的,最后我用的是singleton。这有点太多了,但除了用sprite作为singleton之外,我没有任何线索。是的,它是粗糙之王使用标签那样。谢谢,我会给它一个goyes,它是粗糙之王使用标签那样。谢谢,我会给它一个gowhoa,谢谢。我会读的。也许它不符合主题。但是谢谢你,第一个瘦的g我是通过阅读你的书,非常有用的书来学习cocos2d的。谢谢你。哇,谢谢。我会读的。也许这不符合主题。但是感谢你,我学习cocos2d的第一件事是通过阅读你的书,非常有用的书。无论如何,谢谢