首页 > 解决方案 > 如何使用 Swift SpriteKit 在 For 循环中一一创建 SKSprite 节点

问题描述

我想通过 For 循环创建 10 个 SKSPrite 节点。我希望节点一个接一个出现,但使用我的代码,所有 10 个节点同时出现。增加等待时间并没有帮助。先感谢您。

for i in 1 ... 10 {

    self.stone[i - 1].position = CGPoint(x: 0 , y: -100)
    self.stone[i - 1].anchorPoint = CGPoint(x: 0.5, y: 0.5)
    self.stone[i - 1].size = CGSize(width: 50, height: 50)
    self.stone[i - 1].physicsBody = SKPhysicsBody(circleOfRadius: 20)
    self.stone[i - 1].physicsBody!.affectedByGravity = false
    self.stone[i - 1].physicsBody!.categoryBitMask = PhysicsCategory.Object1
    self.stone[i - 1].zPosition = 2
    self.addChild(self.stone[i - 1])   

    let actionMove = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 0.3)
    let actionRolling = SKAction.animate(with: stone[i - 1].arrayTexture, timePerFrame: 0.05)
    let actionDelay = SKAction.wait(forDuration: 1.0)
    let actionSequence = SKAction.sequence([actionMove,actionRolling,actionDelay])
    stone[i - 1].run(actionSequence)
}

标签: iosfor-loopswift3sprite-kitskspritenode

解决方案


您在代码中所做的所有事情都是创建一个创建节点的循环,您在该循环中应用于这些节点的任何持续时间都会平等地影响它们。您需要一个在循环之外的变量,该变量在每个节点实例的循环中递增。

var delay: Double = 1.0 

for i in 1 ... 10 {

    self.run(.wait(forDuration: delay) {

        self.stone[i - 1].position = CGPoint(x: 0 , y: -100)
        self.stone[i - 1].anchorPoint = CGPoint(x: 0.5, y: 0.5)
        self.stone[i - 1].size = CGSize(width: 50, height: 50)
        self.stone[i - 1].physicsBody = SKPhysicsBody(circleOfRadius: 20)
        self.stone[i - 1].physicsBody!.affectedByGravity = false
        self.stone[i - 1].physicsBody!.categoryBitMask = PhysicsCategory.Object1
        self.stone[i - 1].zPosition = 2
        self.addChild(self.stone[i - 1])   

        let actionMove = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 0.3)
        let actionRolling = SKAction.animate(with: stone[i - 1].arrayTexture, timePerFrame: 0.05)
        let actionDelay = SKAction.wait(forDuration: 1.0)
        let actionSequence = SKAction.sequence([actionMove,actionRolling,actionDelay])
        stone[i - 1].run(actionSequence)
    }

    delay += 1.0
}

推荐阅读