Используя cocos2D, как создать анимацию, используя спрайты из двух листов спрайтов? - PullRequest
0 голосов
/ 22 мая 2011

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

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

        //=======================================================================================// 
    //Load Stars

    frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
    [frameCache addSpriteFramesWithFile:@"starsOne_01.plist"];
    [frameCache addSpriteFramesWithFile:@"starsOne_02.plist"];


    starSpriteNodeOne_01 = [CCSpriteBatchNode batchNodeWithFile:@"starsOne_01.png"];
    [self addChild:starSpriteNodeOne_01 z:-2];
    starSpriteNodeOne_02 = [CCSpriteBatchNode batchNodeWithFile:@"starsOne_02.png"];
    [self addChild:starSpriteNodeOne_02 z:-2];



     //Load frames
    starOneFrames_01 = [NSMutableArray array];
    for(int i = 1; i <= 12; ++i) {
    [starOneFrames_01 addObject:
    [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
    [NSString stringWithFormat:@"starsOne_%d.png", i]]];
    }

    starOneAnim_01 = [CCAnimation animationWithFrames:starOneAnim_01 delay:0.5f];
    [[CCAnimationCache sharedAnimationCache] addAnimation:starOneAnim_01 name:@"starOneAnim_01"];


     //=======================================================================================//    
     //Add stars to the scene

    starsOne = [CCSprite spriteWithSpriteFrameName:@"starsOne_1.png"];
    starsOne.anchorPoint = ccp(0, 0.5);
    starsOne.position = ccp(0, size.height/2);
    [starSpriteNodeOne_01 addChild:starsOne];

   //animate
    starOneAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:starOneAnim_01 restoreOriginalFrame:YES]];
    [starsOne runAction:starOneAction];

Есть идеи, где я иду не так? Заранее спасибо.

Привет @JorisMans, Я попробовал ваш метод, и он, кажется, работает до того момента, когда он пытается добавить анимацию ко второй последовательности. Я попытался запустить методы в обратном порядке (так что сначала starAnimation_02), и он по-прежнему дает то же самое. Первый метод работает нормально, затем, когда запускается второй вызываемый метод, он падает. Вот два моих метода, я сохранил CCLOG в одном из них, чтобы вы понимали, где он падает. Программа достигает REACHED3 CCLOG перед сбоем.

-(void)starAnimation_01
{

[starsOne_01 setVisible:YES];
[starsOne_02 setVisible:NO];
CCCallFunc* customCall = [CCCallFunc actionWithTarget:self selector:@selector(starAnimation_02)]; 
CCSequence* actionSeq = [CCSequence actions:[CCAnimate actionWithAnimation:starOneAnim_01 restoreOriginalFrame:NO],customCall,nil];

[starsOne_01 runAction:actionSeq];

}

-(void)starAnimation_02
{

[starsOne_02 setVisible:YES];
CCLOG(@"===================REACHED========================");
[starsOne_01 setVisible:NO];
CCLOG(@"===================REACHED2========================");
CCCallFunc* customCall2 = [CCCallFunc actionWithTarget:self selector:@selector(starAnimation_01)]; 
CCLOG(@"===================REACHED3========================");
CCSequence* actionSeq2 = [CCSequence actions:[CCAnimate actionWithAnimation:starOneAnim_02 restoreOriginalFrame:NO],customCall2,nil];
CCLOG(@"===================REACHED4========================");
[starsOne_02 runAction:actionSeq2]; 
}

1 Ответ

0 голосов
/ 22 мая 2011

Каждый узел имеет свою собственную таблицу спрайтов.Вы не можете применить изображения spritesheet от одного узла до другого.

Одно возможное решение (извините за то, что не давали код, но, возможно, вы можете его выяснить):

  1. Создайте 2 CCAnimations, по одной для каждой spritesheet
  2. Добавьте первоезвездный узел и второй звездный узел как дочерние узлы «я»
  3. скрыть второй звездный узел
  4. Применить последовательность действий к первому звездному узлу, где вы воспроизводите анимацию спрайтов вашего первогоspritesheet, без повтора, и в конце анимации вы делаете пользовательский обратный вызов
  5. . В своем пользовательском обратном вызове вы скрываете первый звездный узел, а второй -
  6. Применяете последовательность действий квторой узел, где вы воспроизводите анимацию спрайтов вашего второго листа спрайтов, без повторений, и в конце анимации вы делаете пользовательский обратный вызов
  7. В своем пользовательском обратном вызове вы скрываете второй звездный узел, а первый - скрываетеone
  8. Переходите к шагу 4

Надеюсь, это вам поможет.

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