从cocos2d中的随机点播放动画

时间:2011-01-29 12:41:40

标签: objective-c cocos2d-iphone

想象一下具有自上而下视图的游戏。从一开始,屏幕上就有10个怪物。每一个都由CCSprite表示,并且应用了连续的CCAnimation

如果我只是使用runAction:[CCAnimate ...]一次对所有怪物运行动画,它们都会同步动画。我想得到的结果是在0和它的持续时间之间的随机点开始每个动画。一旦动画到达其端点,它应该从头开始并像往常一样继续循环。

在没有修改cocos2d源代码的情况下,我还没有找到实现此结果的方法。而且,我无法为CCRepeatForeverCCSequence获得适当的结果(当我想要循环两个或更多连续动画时。后一种情况的代码:

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],因为在切换到另一个动作之前,这两个动作中的每个动作都可以重复任意次数。

我将很感激有关这个问题的任何想法。谢谢。

3 个答案:

答案 0 :(得分:0)

如何在动作之间添加随机延迟......如下:

[self runAction:[CCSequence actions:[CCDelayTime actionWithDuration:arc4random()%5 + 3],idleAction,moveAction,nil]];

答案 1 :(得分:0)

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

我认为这样做可能会回答你的问题。

答案 2 :(得分:0)

我实际上已经实现了你需要的东西。这是拉取请求: - https://github.com/cocos2d/cocos2d-iphone/pull/249

通过我的更改,您可以在动画的任何位置以确定性和随机方式启动基于SpriteFrame的动画。

我不确定他们最终是否最终合并。