我正在学习Cocos2d并构建一个应用程序,我在一端有精灵,我需要通过它在另一边和我一样,我从屏幕上删除精灵,一段时间后,我显示相同。
现在我的应用程序中有一个图像文件夹,我需要每次从同一文件夹以随机顺序加载不同的图像,并保持这些图像不会一次又一次重复的日志。我能够从文件夹中加载图像:
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:bundleRoot error:nil];
NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"]];
现在我将如何调用此数组并每次显示不同的图像,并保持图像不会重复的日志。我已经浏览了this和this这样的链接,但是已经过了。任何线索都会非常有帮助。感谢您的帮助。
答案 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];
}