#ios #uiimageview #cocos2d-iphone #ccsprite
#iOS #uiimageview #cocos2d-iphone #ccsprite
Вопрос:
Я хочу сделать что-то похожее на API в UIImageView, где вы предоставляете, скажем, 5 изображений, и через определенное время UIImageView будет переключаться между этими изображениями. Я хочу сделать это в CCSprite, но единственные способы, которые я слышу об этом, — это настройка фреймов узла или что-то в этом роде.
Кто-нибудь знает простой способ добиться чего-то подобного, когда я предоставляю, скажем, 5 изображений, и я хочу, чтобы они проходили через них за 4 секунды?
Спасибо!
Ответ №1:
//initialize anitmation
CCAnimation *anime= [[CCAnimation alloc] initWithName:@"anime" delay:4.0];
for(int i = 1; i <= 5; i ){
[anime addFrameWithFilename:[NSString stringWithFormat:@"frame%d.png", i]];
}
id animeAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:anime]];
[self runAction:animeAction];
Он принимает 5 изображений и анимирует их за 4.0 периода.
—— Редактировать —— Вот как вы можете это сделать с помощью нового Cocos2d Api 1.0.1 :
//initialize anitmation
CCAnimation *anime= [CCAnimation animation];
anime.delay = 4.0;
for(int i = 1; i <= 5; i ){
[anime addFrameWithFilename:[NSString stringWithFormat:@"frame%d.png", i]];
}
id animeAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:anime]];
[self runAction:animeAction];
Комментарии:
1. Вау, это превосходно! 2 вопроса: 1. Если у меня есть 5 изображений, означает ли это, что у меня есть 5 строк ..addFrameWithFileName ? 2. Будет ли эта анимация выполняться бесконечно?
2. На самом деле есть проблема с этим кодом. Нет такого API, как initWithName, есть только initWithFrames . Если бы вы намеревались использовать initWithFrames, как бы мы модифицировали код, чтобы он все равно достигал того же результата? Также игнорируйте этот вопрос о том, будет ли он выполняться бесконечно. Но каким будет ответ и на # 1?
3. Вот документация cocos2d для класса CCAnimation . Вы можете проверить это и посмотреть initWithName : cocos2d-iphone.org/api-ref/0.9.0-beta2 /…
4. Что касается вашего первого комментария, q1 да, у вас будет 5 строк adframewithfilename и да, он также запускает анимацию на неопределенный срок
5. @tylerdurden вы ссылались на полностью устаревшую (январь 2010) версию ссылки на API. Может быть, вам следует обновить свои закладки? 😉 Вот наиболее обновленный (и полный) Ссылка на API: learn-cocos2d.com/api-ref/latest/cocos2d-iphone/html /…
Ответ №2:
Создайте 5 спрайтов с 5 разными изображениями. Поместите их все в одно и то же положение. Установите 4 спрайта невидимыми (sprite.visible = НЕТ).
Если вы хотите изменить спрайты, вам нужно только установить для другого спрайта значение visible, а для текущего видимого — значение invisible. Вы также можете применить такие действия, как CCFadeTo, для исчезновения одного спрайта при одновременном исчезновении другого.
Если вы используете затухание, убедитесь, что вы по-прежнему устанавливаете свойство visible из соображений производительности. Спрайты с непрозрачностью 0 по-прежнему отображаются, в то время как спрайты, которые не видны, не отображаются.
Комментарии:
1. Хороший ответ. Как мне установить продолжительность, хотя, как я могу это сделать?
2. [self scheduleSelector:@selector (nextSprite:) интервал: 4];
3. Запланированный селектор — один из способов сделать это, вы также можете использовать действие CCSequence.
Ответ №3:
Взгляните на CCAnimation
, CCAnimate
и CCSpriteFrame
классы.
CCSpriteFrame
Представляет собой фрагмент более крупной текстуры, известной как лист спрайтов. Вы можете поместить свои пять изображений на один лист.
CCAnimation
позволяет создать анимацию из последовательности таких кадров и задать скорость, с которой выполняется анимация.
И CCAnimate
позволяет запускать эту анимацию как действие:
[node runAction:[CCAnimate actionWithAnimation:animationInstance restoreOriginal:NO]];
.
Ссылки
Zwoptex для создания спрайтовых листов — также есть бесплатная флеш-версия
Комментарии:
1. Я бы предпочел не использовать лист спрайтов в моем случае, так как все ресурсы в моем проекте уже есть, и в этом случае мне пришлось бы много переделывать, чтобы получить фактический лист спрайтов в проекте! Могу ли я сделать это с отдельными изображениями?
2. Ты можешь. Просто создайте CCSpriteFrames с помощью CCSprites:
CCSpriteFrame *frameVersionOfSprite = [spriteYouveAlreadyCreated displayedFrame]
3. Пример кода, предоставленный @tylerdurden, очень полезен для вашего конкретного случая, и наши ответы хорошо дополняют друг друга, один из них предоставляет фон, другой — пример кода.