CCActionSequence/CCActionDelay не задерживает каждое действие?

У меня есть функция, которая создает CCSprite и перемещает его по экрану:

func fireWeapon(target: CGPoint) {
    let projectile = CCBReader.load("Projectile") as! CCSprite
    projectile.position = player.position;
    self.addChild(projectile);

    let moveAction = CCActionMoveTo(duration: 1, position: target);
    let delayAction = CCActionDelay(duration: 1);
    let removeAction = CCActionCallBlock(projectile.removeFromParentAndCleanup(true));

    projectile.runAction(CCActionSequence(array: [moveAction, delayAction, removeAction]));
}

Я пытаюсь очистить спрайты после того, как они закончат свое действие перемещения, выполнив removeFromParentAndCleanup() в последовательности с действием перемещения. Тем не менее, каждое действие запускается мгновенно после друг друга в последовательности без задержек. Спрайты очищаются сразу после создания. Почему не работают задержки? Я пробовал с и без действия CCDelay, и я получил тот же результат.

1 ответ

Решение

Решил мою собственную проблему. Оказывается, что я использовал неправильный синтаксис для CCActionCallBlock(), вы должны фактически заключить свой блок кода в функцию void, например, так:

func fireWeapon(target: CGPoint) {
    let projectile = CCBReader.load("Projectile") as CCNode
    projectile.position = player.position;
    self.addChild(projectile);

    let moveAction = CCActionMoveTo(duration: 1, position: target);
    let delayAction = CCActionDelay(duration: 3);
    let removeAction = CCActionCallBlock { () -> Void in
        projectile.removeFromParentAndCleanup(true);
    }
    projectile.runAction(CCActionSequence(array: [moveAction, delayAction, removeAction]));
}

Надеюсь, это поможет многим людям, потому что я видел много с этой проблемой, и им никогда не предлагалось решение.

Другие вопросы по тегам