延迟移动数组中的几个 SKSpriteNode?

Move several SKSpriteNode in array with delay?

我在移动数组中的多个节点时遇到问题。有一个代码:

SKSpriteNode* paddle = (SKSpriteNode*)[self childNodeWithName: paddleXCategoryName];

SKAction *move = [SKAction moveTo:CGPointMake(paddle.position.x, CGRectGetMaxY(self.scene.frame)) duration:1.5];

NSMutableArray *shots = [[NSMutableArray alloc] init];

for (int i = 1; i<=10; i++) {
    SKSpriteNode *shot = [[SKSpriteNode alloc] initWithImageNamed:@"shoot.png"];
    shot.size = CGSizeMake(2, 5);

    shot.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(2, 6)];
    shot.physicsBody.categoryBitMask    = shotCategory;
    shot.physicsBody.contactTestBitMask = blockCategory;
    shot.physicsBody.collisionBitMask   = blockCategory;

    [shots addObject:shot];
}

int i = 0;
for (SKSpriteNode *shot in shots) {
    SKAction *wait = [SKAction waitForDuration:0.2+0.3*i];
    shot.position = paddle.position;
    [self addChild:shot];
    [shot runAction:[SKAction sequence:@[wait, move]] completion:^{
        [shot removeFromParent];
    }];
}

我只有一个节点在移动。我做错了什么?

他们都运行相同的移动动作。每个精灵都需要 运行 自己的动作副本。尝试通过将 move 替换为 [move copy]:

来更改 运行Action 语句
[shot runAction:[SKAction sequence:@[wait, [move copy]]] completion:^{
    [shot removeFromParent];
}];

实际上你所有的节点都在毫不拖延地一起移动到同一个点。这是因为您没有在循环内递增 i 变量。试试下面的代码。为了让 SKAction 正常工作,还要将 affectedByGravity 设置为 false。

int i = 0;
for (SKSpriteNode *shot in shots) {
    SKAction *wait = [SKAction waitForDuration:0.2+0.3*i];
    shot.position = paddle.position;
    [self addChild:shot];
    shot.physicsBody.affectedByGravity = false; // Added line.
    [shot runAction:[SKAction sequence:@[wait, move]] completion:^{
        [shot removeFromParent];
    }];

    i++; // Added line.
}