Последовательное выполнение SKA-действий на нескольких SK-узлах - PullRequest
1 голос
/ 05 мая 2020

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

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

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

Затем я попробовал это в надежде, что l oop завершит блок кода каждой карты перед переходом к следующей карте. Однако все действия выполняются одновременно. Я немного растерялся и не знаю, как это эффективно реализовать. Единственное, что я мог придумать, - это создать «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)
        }
    }

}
...