Ios Cocos2d:Can';似乎无法使用类或实例方法正确创建子精灵

Ios Cocos2d:Can';似乎无法使用类或实例方法正确创建子精灵,ios,methods,cocos2d-iphone,instance,sprite,Ios,Methods,Cocos2d Iphone,Instance,Sprite,我昨天也发了一条类似的帖子,但几乎没有收到任何回复,可能是因为缺乏细节。我会更彻底的 因此,我一直在清理添加了tmx映射的类(JoinedMapLayer),并运行update、draw等。我尝试将一些方法添加到其他类中,但没有完全成功。有些人创建精灵并成功地将其显示在屏幕上,但JoinedMapLayer似乎再也无法识别它们了,即使它们来自它的头文件。因此,我不能使用JoinedMapsLayer或其他类来删除它。我尝试在添加断点后(无论添加到哪里)设置断点,并在控制台中键入po[sprite

我昨天也发了一条类似的帖子,但几乎没有收到任何回复,可能是因为缺乏细节。我会更彻底的

因此,我一直在清理添加了tmx映射的类(JoinedMapLayer),并运行update、draw等。我尝试将一些方法添加到其他类中,但没有完全成功。有些人创建精灵并成功地将其显示在屏幕上,但JoinedMapLayer似乎再也无法识别它们了,即使它们来自它的头文件。因此,我不能使用JoinedMapsLayer或其他类来删除它。我尝试在添加断点后(无论添加到哪里)设置断点,并在控制台中键入po[spritename],结果显示为nil

也许我只是不明白这是怎么回事,我一定是采取了错误的方法。如果有人能帮我一劳永逸地理解这一点,我将不胜感激

我遇到了一个很好的例子,我又一次没有成功。这个根本没有出现

在这里,我可以向您展示我曾经拥有的,非常有效的:

(in.h)JoinedMapsLayer的接口我有:

CCSprite *selectionScreenOverlaySprite;
CCSpriteBatchNode * selectionScreenOverlaySpriteSheet;
我的财产:

@property(nonatomic, retain) CCSprite *selectionScreenOverlaySprite;
@property(nonatomic, retain) CCSpriteBatchNode *selectionScreenOverlaySpriteSheet;
@synthesize selectionScreenOverlaySprite, selectionScreenOverlaySpriteSheet;
声明方法:

-(void) addSelectionScreenOverlay;
(In.m)我合成我的属性:

@property(nonatomic, retain) CCSprite *selectionScreenOverlaySprite;
@property(nonatomic, retain) CCSpriteBatchNode *selectionScreenOverlaySpriteSheet;
@synthesize selectionScreenOverlaySprite, selectionScreenOverlaySpriteSheet;
我的方法:

-(void) addSelectionScreenOverlay {

    // overlay

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"selectionScreenOverlay.plist"];

    selectionScreenOverlaySpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"selectionScreenOverlay.png"];

    NSMutableArray *selectionScreenFrames = [NSMutableArray array];

    [selectionScreenFrames addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"selectionScreenOverlay.png"]]];

    selectionScreenOverlaySprite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"selectionScreenOverlay.png"]];  

    [selectionScreenOverlaySpriteSheet addChild:selectionScreenOverlaySprite];

    [self addChild:selectionScreenOverlaySpriteSheet z:13];

    selectionScreenOverlaySprite.position = [self convertToNodeSpace:CGPointMake(512, 384)];
    selectionScreenOverlaySprite.scale = 260;

    selectionScreenOverlaySprite.opacity = 0;

}
所以这很好用


但是当我在头文件中导入一个名为SpriteFX.h的类并调用新方法时,什么都没有发生

我这样调用类方法:

[SpriteFX addSelectionScreenOverlayOnLayer:self
                                withSprite:selectionScreenOverlaySprite
                           withSpriteSheet:selectionScreenOverlaySpriteSheet];
+(void) addSelectionScreenOverlayOnLayer:(CCLayer*)layer
                              withSprite:(CCSprite*)sprite
                         withSpriteSheet:(CCSpriteBatchNode*)spriteSheet;
+(void) addSelectionScreenOverlayOnLayer:(CCLayer*)layer
                              withSprite:(CCSprite*)sprite
                         withSpriteSheet:(CCSpriteBatchNode*)spriteSheet {

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"selectionScreenOverlay.plist"];

    spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"selectionScreenOverlay.png"];

    NSMutableArray *selectionScreenFrames = [NSMutableArray array];

    [selectionScreenFrames addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"selectionScreenOverlay.png"]]];

    sprite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"selectionScreenOverlay.png"]];  

    [spriteSheet addChild:sprite];

    [layer addChild:spriteSheet z:13];

    sprite.position = [layer convertToNodeSpace:CGPointMake(512, 384)];
    sprite.scale = 260;

    sprite.opacity = 0;
}
我在SpriteFX.h中声明了如下方法:

[SpriteFX addSelectionScreenOverlayOnLayer:self
                                withSprite:selectionScreenOverlaySprite
                           withSpriteSheet:selectionScreenOverlaySpriteSheet];
+(void) addSelectionScreenOverlayOnLayer:(CCLayer*)layer
                              withSprite:(CCSprite*)sprite
                         withSpriteSheet:(CCSpriteBatchNode*)spriteSheet;
+(void) addSelectionScreenOverlayOnLayer:(CCLayer*)layer
                              withSprite:(CCSprite*)sprite
                         withSpriteSheet:(CCSpriteBatchNode*)spriteSheet {

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"selectionScreenOverlay.plist"];

    spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"selectionScreenOverlay.png"];

    NSMutableArray *selectionScreenFrames = [NSMutableArray array];

    [selectionScreenFrames addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"selectionScreenOverlay.png"]]];

    sprite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"selectionScreenOverlay.png"]];  

    [spriteSheet addChild:sprite];

    [layer addChild:spriteSheet z:13];

    sprite.position = [layer convertToNodeSpace:CGPointMake(512, 384)];
    sprite.scale = 260;

    sprite.opacity = 0;
}
我在SpriteFX.m中的方法如下所示:

[SpriteFX addSelectionScreenOverlayOnLayer:self
                                withSprite:selectionScreenOverlaySprite
                           withSpriteSheet:selectionScreenOverlaySpriteSheet];
+(void) addSelectionScreenOverlayOnLayer:(CCLayer*)layer
                              withSprite:(CCSprite*)sprite
                         withSpriteSheet:(CCSpriteBatchNode*)spriteSheet;
+(void) addSelectionScreenOverlayOnLayer:(CCLayer*)layer
                              withSprite:(CCSprite*)sprite
                         withSpriteSheet:(CCSpriteBatchNode*)spriteSheet {

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"selectionScreenOverlay.plist"];

    spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"selectionScreenOverlay.png"];

    NSMutableArray *selectionScreenFrames = [NSMutableArray array];

    [selectionScreenFrames addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"selectionScreenOverlay.png"]]];

    sprite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"selectionScreenOverlay.png"]];  

    [spriteSheet addChild:sprite];

    [layer addChild:spriteSheet z:13];

    sprite.position = [layer convertToNodeSpace:CGPointMake(512, 384)];
    sprite.scale = 260;

    sprite.opacity = 0;
}
没有豆子

如果我理解正确,因为我将self作为CCLayer传递,那么我的类方法中的层应该指向joinedMapLayer中的CCLayer。此外,传递的精灵和精灵图纸应指向JoinedMapLayer,因此其工作原理应相同。。但事实并非如此


在JoinedMapLayer中调用类方法后,我检查了selectionScreenOverlaySprite上的父对象。它是零。

在您的第一段代码中,您没有正确访问属性。您应该使用自指针来获取属性。。。在代码中,您只是直接访问ivar。现在ARC理论上应该在ivar上执行正确的保留/释放操作,但仍然如此

self.selectionScreenOverlaySpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"selectionScreenOverlay.png"];
在第二个示例中,spriteSheet是传递给方法的一个参数,您可以立即在第二行用新值覆盖该参数,因此spriteSheet中的所有内容现在都将丢失。这取决于代码的其余部分,可能重要,也可能不重要,但无论是谁调用您的共享方法,都将无法引用sprite工作表


如果您在ARC上,则运行时可能会在调用addChild之后立即释放spriteSheet。我不太清楚这些引用是如何在cocos2d中设置的,但是如果它们很弱或者没有保留,那么这也可能是一个问题。

谢谢您的解释。有趣的是,注意到“任何调用我的共享方法的人都无法引用sprite表”;它会失去它的父属性吗?我使用的是没有ARC的0.95 Cocos2D的编辑版本。不,这是因为在共享方法中修改变量不会自动将值复制回调用该方法的人。您需要声明它**在方法签名中键入,因此*var=blah;,然后将值复制回调用方。