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

问题描述 投票:0回答:1

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

现在我的应用程序中有一个图像文件夹,我需要每次从同一文件夹中以随机顺序加载不同的图像,并维护一个日志,确保这些图像不会一次又一次重复。我可以使用以下命令从文件夹加载图像:

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

现在我如何调用这个数组并每次显示不同的图像,并维护一个图像不重复的日志。我已经浏览过诸如 thisthis 之类的链接,但无济于事。

iphone objective-c cocos2d-iphone
1个回答
1
投票

最好的方法是创建一个 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];

}
© www.soinside.com 2019 - 2024. All rights reserved.