0

我需要CCMoveTo连续移动一个精灵,作为一系列动作。但是,每次迭代都需要更改精灵本身以及持续时间。这是单一动作。

id cloudAction = [CCSequence actions:
                      [CCMoveTo actionWithDuration:15.0 position:ccp(-spriteCloud.contentSize.width/2, windowSize.height/2)],
                      cloudActionComplete,
                      nil
                      ];
[spriteCloud runAction:cloudAction];

15秒,精灵本身,开始位置,结束位置都需要在每次CCMoveTo完成时更改。但我不确定如何有效地从cloudActionComplete阻止操作重新运行此操作。CCRepeatForever由于我的动作的动态性质,我无法使用。也许有更好的方法来完成这样的任务?

更新:

这是我的尝试

    id cloudActionComplete = [CCCallBlock actionWithBlock:^(void)
                           {
                               spriteCloud.position = ccp(windowSize.width + spriteCloud.contentSize.width/2, windowSize.height/2);
                               id cloudAction = [CCSequence actions:
                                                 [CCMoveTo actionWithDuration:RANDOMRANGE(2, 10) position:ccp(-spriteCloud.contentSize.width/2, windowSize.height/2)],
                                                 cloudActionComplete,
                                                 nil
                                                 ];
                               [spriteCloud runAction:cloudAction];
                           }];

    [spriteCloud runAction:cloudActionComplete];

它只工作一次,我认为问题在于完成动作递归。cloudActionComplete是零。

4

1 回答 1

0

您不能在块内使用相同的块变量,因为它尚未初始化。或者,您可以创建一个函数来移动您的云

- (void) moveCloud:(CCSprite*)spriteCloud
{
    spriteCloud.position = ccp(windowSize.width + spriteCloud.contentSize.width/2, windowSize.height/2);
    id cloudAction = [CCSequence actions:
                      [CCMoveTo actionWithDuration:RANDOMRANGE(2, 10) position:ccp(-spriteCloud.contentSize.width/2, windowSize.height/2)],
                      [CCCallFuncN actionWithTarget:self selector:@selector(moveCloud:)],
                      nil
                      ];

    [spriteCloud runAction:cloudAction];
}
于 2013-07-04T02:22:11.307 回答