cocos2d iphone - Cómo cambiar la imagen de un CCSprite
cocos2d-iphone texture2d (3)
Para cambiar la imagen de CCSprite como una animación con 1 segundo entre cada fotograma:
CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache];
CCSpriteFrame *frame1 = [cache spriteFrameByName:[NSString stringWithFormat:@"plist_file_key_here1.png"]];
CCSpriteFrame *frame2 = [cache spriteFrameByName:[NSString stringWithFormat:@"plist_file_key_here2.png"]];
NSArray *animFrames = [NSArray arrayWithObjects:frame1, frame2, nil];
CCAnimation *animation = [CCAnimation animationWithFrames:animFrames delay:1.0f];
[originalSprite runAction:[CCAnimate actionWithAnimation:animation restoreOriginalFrame:NO]];
Tengo un CCSprite que se inicializa usando [CCSprite spriteWithSpriteFrameName:@"plist_file_key_here.png"]
. Ya agregué todos los sprites de mi archivo plist a CCSpriteFrameCache. He intentado configurar la textura de esta manera:
CCSpriteFrame * frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:name];
NSAssert(frame.texture!=nil, @"frame.texture can''t equal nil"); //this works fine
[sprite setTexture:frame.texture]; //doesn''t cause a white square to appear, just doesn''t switch the image.
Como dije en mis comentarios, esto no funciona. Creo que tiene algo que ver con la diferencia entre usar [CCSprite spriteWithFile:]
y [CCSprite spriteWithSpriteFrameName:]
, que se basa en sprites frames cargados en CCSpriteFrameCache desde un atlas de texturas. Al usar sprites cargados desde un atlas de textura, la textura de cada sprite es igual a la textura de la hoja de sprite. ¿Hay alguna forma de evitar esto o tengo que eliminar y volver a crear el sprite? Si esa es mi única opción, ¿hay alguna forma de eliminar un ccnode de su principal pero preservando sus hijos?
La referencia de API para rescatar!
Cuando tienes una textura con marco de sprite, no quieres cambiar la textura, sino el marco de sprite que usa el sprite. Que puedes hacer de la siguiente manera:
CCSpriteFrameCache* cache = [CCSpriteFrameCache sharedSpriteFrameCache];
CCSpriteFrame* frame = [cache spriteFrameByName:name];
sprite.displayFrame = frame;
en cocos2d v3 debería ser:
sprite.spriteFrame = frame;
Considere un objeto CCSprite llamado mySprite. Ahora puedes cambiar la imagen del sprite de la siguiente manera:
[mySprite setTexture:[[CCTextureCache sharedTextureCache] addImage:[Tools imageNameForName:"myNewImage.png"]]];
Esto cambiará la imagen del objeto CCSprite mySprite a myNewImage.png
Nota: Si la imagen que se va a cambiar se encuentra en una carpeta particular de los elementos, puede evaluar esa imagen utilizando toda la ruta de la imagen.