Попытка задержать порождение узлов с помощью waitForDuration в didMoveToView со сценой SpriteKit (SWIFT), но не работает

Я пытаюсь остановить падение моих узлов всего на секунду или две в начале игры. Итак, моя проблема в том, что когда я нажимаю «Пуск», узлы уже находятся на полпути вниз по экрану. Я также пытался изменить начальную высоту узлов, но это кажется дорогостоящим решением, так как я хочу быть осторожным, чтобы не допустить, чтобы мой FPS стал слишком низким. В своем коде я пытаюсь сделать это в didMoveToView и использую waitForDuration, но это не работает.

Пример изображения падающих узлов

Кто-нибудь из мастеров SpriteKit знает, что мне делать? Я использую Свифт. Вот мой код:

    override func didMoveToView(view: SKView) {

            let wait = SKAction.waitForDuration(2.5)
            let run = SKAction.runBlock {
                self.spawnNumbers()
            }
            numContainer.runAction(SKAction.sequence([wait, run]))
    }

func spawnNumbers() {

        let minValue = self.size.width / 8
        let maxValue = self.size.width - 36

        let spawnPoint = CGFloat(arc4random_uniform(UInt32(maxValue - minValue)))
        let action = SKAction.moveToY(-300, duration: 2)

        numContainer = SKSpriteNode(imageNamed: "Circle")
        numContainer.name = "Circle"
        numContainer.size = CGSize(width: 72, height: 72)
        numContainer.anchorPoint = CGPointMake(0, 0)
        numContainer.position = CGPoint(x: spawnPoint, y: self.size.height)
        numContainer.runAction(SKAction.repeatActionForever(action))
        numContainer.zPosition = 2

        let numberLabel = SKLabelNode(fontNamed: "AvenirNext-Bold")
        numberLabel.text = "\(numToTouch)"
        numberLabel.name = "Label"
        numberLabel.zPosition = -1
        numberLabel.position = CGPointMake(CGRectGetMidX(numContainer.centerRect) + 36, CGRectGetMidY(numContainer.centerRect) + 36)
        numberLabel.horizontalAlignmentMode = .Center
        numberLabel.verticalAlignmentMode = .Center
        numberLabel.fontColor = UIColor.whiteColor()
        numberLabel.fontSize = 28

        addChild(numContainer)
        numContainer.addChild(numberLabel)
        numContainerArray.append(numContainer)
        numToTouch += 1
    }

person Parker Donat    schedule 19.05.2016    source источник
comment
Так это основано на физике? Кроме того, что ты собирался сказать, так как я хочу быть ca?   -  person cocojoe    schedule 19.05.2016
comment
@cocojoe приложение не основано на физике. (Также исправлена ​​опечатка.)   -  person Parker Donat    schedule 20.05.2016
comment
Итак, spawnNumbers() запускает действие за вас, и оно вызывается только в этом блоке действий? Почему бы не использовать свою последовательность действий после того, как игрок нажмет кнопку запуска? Любопытно ваше заявление «держите мой FPS низким»?   -  person cocojoe    schedule 20.05.2016
comment
Показать self.spawnNumbers()   -  person Simone Pistecchia    schedule 20.05.2016
comment
FPS — это кадры в секунду. Я сказал это, потому что НЕ хочу иметь низкие рамки.   -  person Parker Donat    schedule 21.05.2016


Ответы (1)


Я думаю, вам нужно перевести 2,5 секунды в NSTimeInterval:

 let wait = SKAction.waitForDuration(NSTimeInterval(2.5))

Вы также можете попробовать поместить действия в функцию init для вашей сцены:

 override init (size: CGSize) {
     super.init(size: size)

     //your code from before
 }

Кроме того, не уверен, что это имеет значение, но это то, что я обычно делаю, и это работает,

 let wait = SKAction.waitForDuration(NSTimeInterval(2.5))
 let action = SKAction.runBlock({() in self.spawnNumbers()})
 let actionThenWait = SKAction.sequence([wait, action])
 self.runAction(actionThenWait)
person Arkidillo    schedule 03.06.2016