2012-01-17 61 views
0

我学习的Cocos2D和构建应用的时候,在一端有雪碧,我需要通过它的另一边,并与同我从屏幕中移除精灵,并在一段时间后,我在显示相同。如何用图像数组cocos2d更改精灵图像?

现在我有我的应用程序图像的文件夹,我需要每次都以随机顺序从同一文件夹中加载不同的图像和维护日志,这些照片不会一次又一次地重复。我能够从文件夹中加载图像有:

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

现在我怎么会叫这个数组,每次显示不同的图像,并且还保持了日志图像没有得到重复。我已经通过链接,如thisthis,但在vail。任何线索都会非常有帮助。感谢您提前的帮助。

回答

1

做到这一点的最好方法是创建一个spriteSheet。首先你可以得到http://zwoptexapp.com/,它的免费,你可以创建你的spritesheet使用科科斯(在出口商请确保你选择cocos2d创建适当的plist)

你想打包所有图像在1大纹理这样你就可以用plist中它添加到您的项目(zwoptex将创建两个你)

那么你就可以

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"your_plist"]; 

切换纹理加载纹理操作慢,所以有在所有图像在完成对spri的纹理更改后,相同的纹理将提升openGL的性能TE是很容易

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

其中FRAME_NAME是在plist中框架的名称(您可以通过选择里面的Xcode plist中看到它。

以随机的方式循环,而不必重复图片... (我会直接在这里写一些伪代码,让我做inits类的声明和内联实现:)内)

//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]; 

} 
+0

感谢您Ultrakorne .. :)让我实现了相同的回来给你。我想这对我很有用。 – Sarah 2012-01-18 09:44:37