Последовательный запуск SKActions на нескольких узлах SKNode

Я создаю карточную игру, и у меня возникают проблемы с запуском SKActions в последовательности для нескольких объектов SK (узлов, текстур, меток и т. д.). Любая помощь приветствуется! В приведенном ниже примере я пытаюсь создать движение «сделки». Когда сдается 1 карта, проходит некоторое время, затем сдается следующая карта. Я попытался использовать это, но с 52 картами это не так. точно самый простой подход.

Сначала я попытался создать массив SKActions для каждой карты. Однако я не верю, что смогу запустить приведенное ниже с помощью одной команды, основываясь на моем понимании документации. Каждое действие должно выполняться для конкретного объекта Sprite, а не выполнять целую последовательность действий для нескольких объектов Sprite.

let dealAction = SKAction[]()
for card in deck {
    let move = SKAction.... 
    dealAction.append(move)
}
run.SKAction.sequence(dealAction) // This will not work. 

Затем я попробовал это в надежде, что цикл завершит блок кода каждой карты, прежде чем перейти к следующей карте. Однако все действия выполняются одновременно. Теперь я немного растерялся и не знаю, как именно это реализовать эффективно. Единственное, что я мог придумать, это создать «timingIndex», где ко времени ожидания для каждой карты добавляется 0,2 секунды. Таким образом, несмотря на то, что все они работают одновременно, время ожидания увеличивается для каждой карты. Однако не уверен, что это лучший способ решить проблему, и надеялся, что есть более элегантное решение.

for card in deck {
    let move = SKAction.... 
    let wait = SKAction.wait(forDuration: 1)
    card.run(SKAction.sequence[move, wait])
}

// Possible Solution
let timingIndex = 0.2
for card in deck {
    let move = SKAction.... 
    let wait = SKAction.wait(forDuration: timingIndex)
    card.run(SKAction.sequence[move, wait])
    timingIndex += 0.2
}

import SpriteKit
import UIKit

let screenH = 100
let screenW = 50

class Player {
    var handLocation: CGPoint
    var pile = [Card]()

    init() {
        handLocation = CGPoint(x: 100, y: 583)
    }
}

class Card: SKSpriteNode {

}

struct Game {
    var player1 = Player()
    var player2 = Player()
    var deck = [Card]()

    func dealDeck() {
        for card in deck {
            player1.pile.append(card) // This would theoretically loop through both players
            card.position = CGPoint(x: screenW / 2, y: screenH / 2)
            let move = SKAction.move(to: player1.handLocation, duration: 1)
            card.run(move)
        }
    }

}

person SharpSharpLes    schedule 05.05.2020    source источник
comment
Единственное, что я мог придумать, это создать индекс времени, где ко времени ожидания для каждой карты добавляется 0,2 секунды. Это сработало для вас? Если это так, то, вероятно, нет ничего плохого в том, что вы делаете. Последовательные действия ожидания, которые действуют как завершения, не так уж плохи, если только вы не ищете очень точное время. Если нет, то вы все равно не заметите, если он отключен на 0,001 секунды.   -  person Left as an exercise    schedule 06.06.2020
comment
Это сработало! Меня немного беспокоит синхронизация остальной части приложения и попытка синхронизировать все... так что на самом деле это не похоже на общесистемное решение. Но для этого примера и проблемы, да, это сработало!   -  person SharpSharpLes    schedule 09.09.2020


Ответы (1)


Это сработало! Беспокоился об использовании этого в целом и о том, существует ли лучшее решение, но на данный момент это сработало.

// Possible Solution
let timingIndex = 0.2
for card in deck {
    let move = SKAction.... 
    let wait = SKAction.wait(forDuration: timingIndex)
    card.run(SKAction.sequence[move, wait])
    timingIndex += 0.2
}
person SharpSharpLes    schedule 09.09.2020