【问题标题】:Time delay for addChild in for loop is causing error! Swiftfor 循环中 addChild 的时间延迟导致错误!迅速
【发布时间】:2018-05-17 16:38:28
【问题描述】:

这个循环我工作得很好,但我想让来自数组的图像一个接一个地进入,它们之间有一个特定的时间。

if transitionSprite.name == nil || transitionSprite.name == "rd-d2c" || transitionSprite.name == "rd-f2c" {
        for (index, roadImage) in cityArrays[randomIndex].enumerated() {

            roadSprite = SKSpriteNode(imageNamed: roadImage)
            roadSprite.anchorPoint = CGPoint(x: 0.5, y: 0.5)
            roadSprite.position = CGPoint(x: 0, y: CGFloat(screenCounter) * roadSprite.size.height)
            roadSprite.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
            roadSprite.physicsBody?.categoryBitMask = PhysicsCategory.RoadImageCategory.rawValue
            roadSprite.physicsBody?.collisionBitMask = PhysicsCategory.NoCollisionsCategory.rawValue
            roadSprite.physicsBody?.contactTestBitMask = PhysicsCategory.BroomCategory.rawValue
            roadSprite.physicsBody?.affectedByGravity = false

            roadSprite.zPosition = 1
            roadSprite.name = "Road \(index)"

            // RUNNING THE SKACTION DELAY ON THIS
            self.addChild(roadSprite)

            addCollectables()
            addJerryCans()

            if roadImage == "rdc-02_05" {
                addBackgroundDetail(detailType: "cityBridge2")
            }
            screenCounter += 1
        }

我创建了这个 SKAction,并将其添加到循环中,

    loopDelay = SKAction.wait(forDuration: Double(index + 1))
    let addRoad = SKAction.run {self.addChild(self.roadSprite)}
    let action = SKAction.sequence([loopDelay, addRoad])
    self.run(action)

不确定是什么原因造成的,但是当我使用我创建的 SKAction 延迟运行它时,它会崩溃并给我这个错误,

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'Attemped to add a SKNode which already has a parent: 
<SKSpriteNode> name:'Road 4' texture:[<SKTexture> 'rdc-02_05' (750 x 
1334)] position:{0, 6670} scale:{1.00, 1.00} size:{750, 1334} 
anchor:{0.5, 0.5} rotation:0.00'

关于为什么延迟会导致这种情况的任何想法?谢谢

【问题讨论】:

    标签: arrays swift for-loop skaction addchild


    【解决方案1】:

    您的问题是您使用属性存储 roadSprite。因此,在 for-in 循环的每次迭代中,您都将存储在该属性中的内容替换为新的 Sprite。

    当每个延迟过去时,他们都会尝试使用相同的 Sprite(这是您创建的最后一个)添加Child,因此第一次添加它,第二次它给您上面的错误:“尝试添加一个SKNode 已经有一个父节点”。

    你想要的是将精灵创建为局部变量,并在 SKAction.run 闭包中捕获该变量:

    let roadSprite = SKSpriteNode(imageNamed: roadImage)
    
    ...
    
    let addRoad = SKAction.run {self.addChild(roadSprite)} //capture the local variable in your closure here
    

    如果您仍然想要引用所有这些 Sprite,那么也许您应该将它们放入一个数组中,而不是覆盖相同的属性。

    【讨论】:

    • 哇,这很简单,实际上我花了多少时间在这上面有点尴尬。非常感谢,您可以节省时间!
    • 很高兴它有帮助 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多