CCActionMoveTo 多个精灵的奇怪行为
CCActionMoveTo strange behavior for multiple sprites
我在使用 cocos2d v3 时看到一些非常奇怪的行为,并试图将精灵数组移动到屏幕中心的一个点,然后再回到它们在圆圈上的原始位置。
这里是我初始化精灵并将它们以围绕屏幕中心的圆形排列添加到场景中的位置:
sprites = [NSMutableArray arrayWithCapacity:spriteCount];
for (int i = 0; i < spriteCount; i++) {
CGFloat xPos = radius*sinf(i*2*M_PI/spriteCount) + screenCenter.x;
CGFloat yPos = radius*cosf(i*2*M_PI/spriteCount) + screenCenter.y;
CCSprite *sprite = [CCSprite spriteWithImageNamed:imageFileNames[i%imageFileNames.count]];
sprite.position = ccp(xPos, yPos);
[self addChild:sprite];
[sprites addObject:sprite];
}
下面是将它们全部移动到屏幕中心并返回到原始位置的代码:
NSMutableArray *actionsArray = [NSMutableArray arrayWithCapacity:sprites.count];
for (CCSprite *sprite in sprites) {
CCActionCallBlock *block = [CCActionCallBlock actionWithBlock:^{
CGPoint pt = ccp(375/2.0, 667/2.0);
CCActionMoveTo *moveToMiddle = [CCActionMoveTo actionWithDuration:duration/2.0f position:pt];
CCActionMoveTo *moveToRing = [CCActionMoveTo actionWithDuration:duration/2.0f position:sprite.position];
CCActionSequence *seq = [CCActionSequence actionWithArray:@[moveToMiddle, moveToRing]];
[sprite runAction:seq];
}];
[actionsArray addObject:block];
}
CCActionSpawn *actionSpawn = [CCActionSpawn actionWithArray:actionsArray];
由于某些我无法弄清楚的原因,要添加到场景中的前 2 个精灵没有正确移动;看起来好像每次它们移动时,它们移动的距离(在 x 和 y 方向上)都是阵列中其他精灵的两倍。除了前 2 个 (i == 0 和 i == 1) 之外的所有精灵都正确移动到 (375/2.0, 667/2.0) 并返回到它们的原始位置。
这 2 个 sprite 的移动方式可能与其他 sprite 不同有什么原因吗?调试此类 CCAction 问题的最佳方法是什么?
您的问题与您的 block/spawn 用法有关。首先,您不需要方块,也不需要 运行 一堆使用生成物的方块。您不妨这样做(这可以解决您的问题):
for (CCSprite *sprite in sprites)
{
CGPoint pt = ccp(375/2.0, 667/2.0);
CCActionMoveTo *moveToMiddle = [CCActionMoveTo actionWithDuration:duration/2.0f position:pt];
CCActionMoveTo *moveToRing = [CCActionMoveTo actionWithDuration:duration/2.0f position:sprite.position];
CCActionSequence *seq = [CCActionSequence actionWithArray:@[moveToMiddle, moveToRing]];
[sprite runAction:seq];
}
导致这种情况发生的问题是 sprite 1 和 2 从您的方块数组中两次对它们执行 运行 操作。这个问题,乍一看,由于时间限制,我能够给出它,与以下问题有关:
CCActionSpawn *actionSpawn = [CCActionSpawn actionWithArray:actionsArray];
我不确定为什么,但 spawn 的迭代次数比应有的 运行 多。也许这是我试过的 cocos2d 版本的一个错误。产卵似乎是罪魁祸首。根据您提供的代码,您不需要以这种方式使用 blocks/spawns,因此上述修复对您有效。
希望对您有所帮助。
编辑:
如果您想在此代码中使用方块和重生点,一个快速修复方法是简单地调用:
[sprite stopAllActions];
调用前:
[sprite runAction...];
我在使用 cocos2d v3 时看到一些非常奇怪的行为,并试图将精灵数组移动到屏幕中心的一个点,然后再回到它们在圆圈上的原始位置。
这里是我初始化精灵并将它们以围绕屏幕中心的圆形排列添加到场景中的位置:
sprites = [NSMutableArray arrayWithCapacity:spriteCount];
for (int i = 0; i < spriteCount; i++) {
CGFloat xPos = radius*sinf(i*2*M_PI/spriteCount) + screenCenter.x;
CGFloat yPos = radius*cosf(i*2*M_PI/spriteCount) + screenCenter.y;
CCSprite *sprite = [CCSprite spriteWithImageNamed:imageFileNames[i%imageFileNames.count]];
sprite.position = ccp(xPos, yPos);
[self addChild:sprite];
[sprites addObject:sprite];
}
下面是将它们全部移动到屏幕中心并返回到原始位置的代码:
NSMutableArray *actionsArray = [NSMutableArray arrayWithCapacity:sprites.count];
for (CCSprite *sprite in sprites) {
CCActionCallBlock *block = [CCActionCallBlock actionWithBlock:^{
CGPoint pt = ccp(375/2.0, 667/2.0);
CCActionMoveTo *moveToMiddle = [CCActionMoveTo actionWithDuration:duration/2.0f position:pt];
CCActionMoveTo *moveToRing = [CCActionMoveTo actionWithDuration:duration/2.0f position:sprite.position];
CCActionSequence *seq = [CCActionSequence actionWithArray:@[moveToMiddle, moveToRing]];
[sprite runAction:seq];
}];
[actionsArray addObject:block];
}
CCActionSpawn *actionSpawn = [CCActionSpawn actionWithArray:actionsArray];
由于某些我无法弄清楚的原因,要添加到场景中的前 2 个精灵没有正确移动;看起来好像每次它们移动时,它们移动的距离(在 x 和 y 方向上)都是阵列中其他精灵的两倍。除了前 2 个 (i == 0 和 i == 1) 之外的所有精灵都正确移动到 (375/2.0, 667/2.0) 并返回到它们的原始位置。
这 2 个 sprite 的移动方式可能与其他 sprite 不同有什么原因吗?调试此类 CCAction 问题的最佳方法是什么?
您的问题与您的 block/spawn 用法有关。首先,您不需要方块,也不需要 运行 一堆使用生成物的方块。您不妨这样做(这可以解决您的问题):
for (CCSprite *sprite in sprites)
{
CGPoint pt = ccp(375/2.0, 667/2.0);
CCActionMoveTo *moveToMiddle = [CCActionMoveTo actionWithDuration:duration/2.0f position:pt];
CCActionMoveTo *moveToRing = [CCActionMoveTo actionWithDuration:duration/2.0f position:sprite.position];
CCActionSequence *seq = [CCActionSequence actionWithArray:@[moveToMiddle, moveToRing]];
[sprite runAction:seq];
}
导致这种情况发生的问题是 sprite 1 和 2 从您的方块数组中两次对它们执行 运行 操作。这个问题,乍一看,由于时间限制,我能够给出它,与以下问题有关:
CCActionSpawn *actionSpawn = [CCActionSpawn actionWithArray:actionsArray];
我不确定为什么,但 spawn 的迭代次数比应有的 运行 多。也许这是我试过的 cocos2d 版本的一个错误。产卵似乎是罪魁祸首。根据您提供的代码,您不需要以这种方式使用 blocks/spawns,因此上述修复对您有效。
希望对您有所帮助。
编辑:
如果您想在此代码中使用方块和重生点,一个快速修复方法是简单地调用:
[sprite stopAllActions];
调用前:
[sprite runAction...];