我正在学习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 之类的链接,但无济于事。
最好的方法是创建一个 spriteSheet。首先你可以得到 http://zwoptexapp.com/ ,它是免费的,你可以创建你的 spritesheet 以便与 cocos 一起使用(在导出器上确保你选择 cocos2d 来创建正确的 plist)
您想将所有图像打包在 1 个大纹理中,以便可以使用 plist 将其添加到您的项目中(zwoptex 将为您创建两者)
然后你可以加载你的纹理
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"your_plist"];
切换纹理是一个缓慢的操作,因此将所有图像置于同一纹理中将提高 openGL 性能,在完成后更改精灵的纹理非常容易
[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
}
@结束
并显示随机帧:
-(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];
}