如何使用cocos2d图像数组更改精灵图像?

时间:2012-01-17 09:46:26

标签: iphone objective-c cocos2d-iphone

我正在学习Cocos2d并构建一个应用程序,我在一端有精灵,我需要通过它在另一边和我一样,我从屏幕上删除精灵,一段时间后,我显示相同。

现在我的应用程序中有一个图像文件夹,我需要每次从同一文件夹以随机顺序加载不同的图像,并保持这些图像不会一次又一次重复的日志。我能够从文件夹中加载图像:

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:bundleRoot error:nil];
NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"]];

现在我将如何调用此数组并每次显示不同的图像,并保持图像不会重复的日志。我已经浏览了thisthis这样的链接,但是已经过了。任何线索都会非常有帮助。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

最好的方法是创建一个spriteSheet。首先你可以获得http://zwoptexapp.com/,它是免费的,你可以创建你的spritesheet与cocos一起使用(在导出器上确保你选择cocos2d来创建合适的plist)

您希望将所有图像打包成1个大纹理,以便使用plist将其添加到项目中(zwoptex将为您创建)

然后你可以用

加载纹理
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"your_plist"];

切换纹理操作很慢,因此将所有图像放在相同的纹理中会提高openGL的性能,在你完成之后改变sprite的纹理非常容易

[yourSprite setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"FRAME_NAME"]];

其中FRAME_NAME是plist中框架的名称(您可以通过选择xcode中的plist来查看它。

以随机方式循环而不重复图像...... (我会在这里直接写一些伪代码,让我在类声明和内联实现中进行操作:))

//WARNING THIS IS PSEUDO CODE :)

    @interface Randomizer {
        //an array of NSStrings containing all you images names    
        NSMutableArray *allImagesFrameNames = [NSMutableArray arrayWithCapacity:NUM_FRAMES];
CCSprite *sprite = alloc init
    }

-(void) resetAllFrames {
[allImagesFrameNames removeAllobjects];

[allImagesFrameName addObject:@"FIRST_IMAGE"];
[allImagesFrameName addObject:@"SECOND_IMAGE"]; //add all your images
}

@end

并显示随机帧:

-(void) display a randomImage {
//if the array is empty, all images are already been randomly displayed, so we reset the array
if([allImagesFrameName count] == 0)
[self resetAllFrames];

//we choose a random index
int randomIndex = arc4random %[allImagesFrameName count];
//we get the frame name at that index
NSString *imageFrameName = [allImagesFrameNames objectAtIndex:randomIndex];

//and we display the frame
[sprite setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:imageFrameName]];

[allImagesFrameNames removeObjectAtIndex:randomIndex];

}