Воспроизвести анимацию из случайной точки в cocos2d

Представьте себе игру с видом сверху вниз. С самого начала на экране 10 монстров. Каждый из них представлен CCSprite с нанесенным на него непрерывным CCAnimation.

Если я просто запущу анимацию сразу на всех монстров с помощью runAction:[CCAnimate ...], все они будут анимироваться синхронно. Результат, который я хочу получить, состоит в том, чтобы запускать каждую анимацию в случайной точке между 0 и ее продолжительностью. Как только анимация достигает своей конечной точки, она должна начинаться с самого начала и продолжаться как обычно, зацикливаясь до бесконечности.

Я не нашел способа добиться такого результата без модификации исходного кода cocos2d. И все же я не могу получить соответствующий результат как для CCRepeatForever, так и для CCSequence (когда я хочу зациклить две или более последовательных анимации с помощью кода для последнего случая:

CCAnimate *idleAction = [CCAnimate actionWithAnimation:...];
CCAnimate *moveAction = [CCAnimate actionWithAnimation:...];

// ...

- (void)playIdleAnimation
{
    [mySprite runAction:
     [CCSequence actions:idleAction,
      [CCCallFunc actionWithTarget:self selector:@selector(playMoveAnimation)],
      nil]];
}

- (void)playMoveAnimation
{
    [mySprite runAction:
     [CCSequence actions:moveAction,
      [CCCallFunc actionWithTarget:self selector:@selector(playIdleAnimation)]
      nil]];
}

Обратите внимание, что я не могу использовать [CCSequence actions:idleAction, moveAction, nil], потому что каждое из двух действий может повторяться произвольное количество раз, прежде чем переключиться на другое.

Буду признателен за любые мысли на эту тему. Спасибо.


person Alexei Sholik    schedule 29.01.2011    source источник


Ответы (3)


Как насчет добавления случайной задержки между действиями. Что-то вроде:

[self runAction:[CCSequence actions:[CCDelayTime actionWithDuration:arc4random()%5 + 3],idleAction,moveAction,nil]];
person xuanweng    schedule 31.01.2011
comment
Задержка будет замечена пользователем. Это нежелательно. - person Alexei Sholik; 31.01.2011

int randomNumber = arc4random()%5;
CGRect frame1 = CGRectMake(0,0,50,50);
CGRect frame2 = CGRectMake(50,0,50,50);
CGRect frame3 = CGRectMake(100,0,50,50);
CGRect frame4 = CGRectMake(150,0,50,50);
CGRect frame5 = CGRectMake(200,0,50,50);

switch (randomNumber) {
case 0:
     // add frames 1,2,3,4,5 to cache
     break;
case 1:
     // add frames 2,3,4,5,1 to cache
     break;
case 2:
     // add frames 3,4,5,1,2 to cache
     break;
// etc etc
}

// run animation forever

я думаю, что этот способ сделать это может ответить на ваши вопросы.

person Coke2Code    schedule 14.02.2011

Я реализовал именно то, что вам нужно некоторое время назад. Вот запрос на включение: - https://github.com/cocos2d/cocos2d-iphone/pull/249

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

Я не уверен, наконец, они объединились или нет.

person Ricardo Sanchez-Saez    schedule 22.07.2013