Как изменить изображение спрайта с массивом изображений cocos2d? - PullRequest
0 голосов
/ 17 января 2012

Я изучаю Cocos2d и создаю приложение, в котором у меня есть спрайт на одном конце, и мне нужно пройти через него на другой стороне, и с тем же самым я удаляю спрайт с экрана, и через некоторое время я отображаю тот же ,

Теперь у меня есть папка изображений в моем приложении, и мне нужно каждый раз загружать разные изображения в случайном порядке из одной и той же папки и вести журнал, чтобы эти изображения не повторялись снова и снова. Я могу загрузить изображения из папки с:

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

Теперь, как бы я назвал этот массив и отображал разные изображения каждый раз, а также вел бы журнал, чтобы изображения не повторялись. Я уже прошел через ссылки, такие как это и это , но в Vail. Любая подсказка будет действительно очень полезна. Спасибо за помощь заранее.

1 Ответ

1 голос
/ 18 января 2012

Лучший способ сделать это - создать spriteSheet.Прежде всего вы можете получить http://zwoptexapp.com/, это бесплатно, и вы можете создать свою таблицу спрайтов для использования с кокосами (в экспортере убедитесь, что вы выбрали cocos2d для создания правильного списка)

Вы хотите упаковатьвсе ваше изображение в 1 большой текстуре, так что вы можете добавить его в свой проект с помощью plist (zwoptex создаст оба для вас)

, затем вы можете загрузить свою текстуру с

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

переключением текстурэто медленная операция, поэтому наличие всех изображений в одной и той же текстуре повысит производительность openGL, после того как вы сделали, что изменить текстуру для спрайта очень легко

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

, где FRAME_NAME - это имякадр в листе (вы можете увидеть его, выбрав список внутри кода xcode.

для случайного цикла без повторения изображений ... (я напишу здесь немного псевдокода, позвольте мне делать внутриобъявление класса и встроенные реализации :))

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...