2013-01-09 2 views
0

J'ai un problème avec la suppression de mes spritesheets après ma sortie de scène ..enlever la texture

Je suis essentiellement les instructions de Ray en supprimant les textures inutilisées dans initialisation

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]; 
[[CCTextureCache sharedTextureCache] removeUnusedTextures]; 
[[CCDirector sharedDirector] purgeCachedData]; 

et dealloc je

CCTexture2D * texture = spriteNode.textureAtlas.texture; 
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromTexture:texture]; 
[[CCTextureCache sharedTextureCache] removeTexture:texture]; 

Reference

Cela fonctionne bien si la la transition vers la scène n'est pas la scène actuelle. Mais quand j'ai essayé de "redémarrer" la scène actuelle, elle plante.

[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:2.0 scene:[currentScene scene] withColor:ccBLACK]]; 

On dirait que le problème est que lors du remplacement de la scène actuelle par la « nouvelle » scène actuelle .. la « nouvelle » init de la scène actuelle est appelée avant que la scène actuelle est désaffectée. Par conséquent, ma «nouvelle» feuille de sprites de scène actuelle a été désallouée juste après sa création.

Comment puis-je supprimer correctement les feuilles de sprites dans ce cas? Ou est-ce que mon approche pour redémarrer la scène actuelle est incorrecte?

Mise à jour: je tentais d'ajouter une scène de chargement comme conseillé mais n'a pas pu le faire fonctionner .. voici ma scène de chargement

+(CCScene *) scene 
{ 
// 'scene' is an autorelease object. 
CCScene *scene = [CCScene node]; 

// 'layer' is an autorelease object. 
LoadingLayer * layer = [[[LoadingLayer alloc]init]autorelease]; 

// add layer as a child to scene 
[scene addChild: layer]; 

// return the scene 
return scene; 
} 


-(id) init{ 

    if(self = [super init]){ 

    winSize = [CCDirector sharedDirector].winSize; 
    CCLabelTTF * loadingLabel = [CCLabelTTF labelWithString:@"Loading..." fontName:@"Marker Felt" fontSize:30]; 
    } 

    loadingLabel.position = ccp(winSize.width/2, winSize.height/2); 
    [loadingLayer addChild:loadingLabel]; 

    [self scheduleUpdate]; 

    } 
return self; 
} 

-(void) update:(ccTime)dt{ 

[self unscheduleUpdate]; 
NSString * bgPlist = @"backgroundsIPAD.plist";; 
NSString * hudPlist = @"hudSpritesIPAD.plist" 
NSString * gameOnePlist = @"gameOneSpritesIPAD.plist"; 

// load background 
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:bgPlist]; 

// load hud 
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:hudPlist]; 

// load sprites 
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:gameOnePlist]; 

[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:2.0 scene:[GameTwoLayer scene] withColor:ccBLACK]]; 
} 

Cela me donnera une touche de la GameTwoLayer dans ce cas, puis un écran noir .. Qu'est-ce que je fais mal?

Répondre

0

En effet, l'init de la nouvelle scène s'exécute avant que votre scène actuelle ne soit désallouée. Cela a du sens puisque vous créez un nouvel objet scène dans votre objet scène actuel.

Vous ne devez pas supprimer de textures, etc. pendant init pour cette raison. Ce n'est pas le bon endroit pour le faire. La scène qui a utilisé les ressources devrait être responsable de la suppression de ces ressources. Suppression des textures, etc devrait être fait dans la méthode dealloc de la scène. Si vous devez éviter le pic de mémoire avec les deux scènes en mémoire en même temps, vous devrez ajouter une scène de «chargement» entre les deux afin que la scène précédente soit désallouée avant le début de la scène suivante.

+0

Merci Steffen. J'ai essayé d'ajouter une scène de chargement entre les deux mais le résultat est bizarre. Fondamentalement, j'ai ma scène actuelle appelle replaceScene avec le LoadingScene .. puis à l'intérieur de LoadingScene je l'ai appelé remplacerScene avec ma "nouvelle" scène actuelle après un certain retard. Mais ce que je vois est une éclaboussure de la "nouvelle" scène actuelle et ensuite de l'écran de chargement. Un aperçu? –