我需要连续使用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
是零。
答案 0 :(得分: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];
}