【问题标题】:sprite not being removed with SKAction精灵没有被 SKAction 移除
【发布时间】:2019-07-31 20:24:05
【问题描述】:

我正在尝试让云层向上移动并生成,但我一直在尝试

'由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试添加已经有父级的SKNode:名称:'(null)'纹理:['CLOUD'(746 x 497)]位置:{ 198.66667175292969, 1227.987060546875} 比例:{0.30, 0.30} 大小:{223.80000305175781, 149.10000610351562} 锚点:{0.5, 0.5} 旋转:0.00'。 '

我不确定出了什么问题,任何帮助将不胜感激

 let cloud1 = SKSpriteNode(imageNamed: "CLOUD")
 let cloud2 = SKSpriteNode(imageNamed: "CLOUD")

class GameScene: SKScene {

override func didMove(to view: SKView) {
          self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
 setUp()
}

func setUp() {

    let block = SKAction.run ({
        self.spawnClouds()

        if (cloud1.position.y  > self.size.height) {

        cloud1.removeFromParent()
            cloud2.removeFromParent()
        }
    })

    let wait = SKAction.wait(forDuration: 9)

    let action = SKAction.repeat(block, count: 10)
            let removes = SKAction.removeFromParent()

    let sequence = SKAction.sequence([block, wait, action, removes])

    self.run(sequence)
}

@objc func spawnClouds() {
    let gapHeight = self.frame.width / 9
    let movementAmount = arc4random() % UInt32(self.frame.width / 2)
    let cloudOffset = CGFloat(movementAmount) - self.frame.width / 4

   // let cloud1 = SKSpriteNode(imageNamed: "CLOUD")

    cloud1.xScale = 0.3
    cloud1.yScale = 0.3
    cloud1.zPosition = 1
    self.addChild(cloud2)
    cloud2.xScale = 0.3
    cloud2.yScale = 0.3
    cloud2.zPosition = 1

    cloud1.position = CGPoint(x:self.frame.minX / 2 + gapHeight / 5 + cloudOffset , y: self.frame.minY  )
    cloud2.position = CGPoint(x:self.frame.maxX / 2 + gapHeight / 5 + cloudOffset , y: self.frame.minY  )

    self.addChild(cloud1)

    var distanceToMove = CGFloat(self.frame.size.width + 2.0 * cloud1.frame.width)
    let moveCloud = SKAction.move(by: CGVector(dx:0, dy:25 * self.frame.width), duration: TimeInterval(self.frame.height / 15 ))

    let newaction = SKAction.removeFromParent()
    let new = SKAction.sequence([moveCloud, newaction])

    cloud1.run(new)
    cloud2.run(new)
}

override func update(_ currentTime: TimeInterval) {

    if cloud2.position.y > size .height {

        cloud1.removeFromParent()
        cloud2.removeFromParent()
    }
    }

}

【问题讨论】:

  • 这是一种非常糟糕的展示代码并请无偿志愿者查看的方式。

标签: ios swift sprite-kit skaction


【解决方案1】:

cloud1 和 cloud2 是属性,即随处可见。因此,当您执行 addChild(cloud1)addChild(cloud2) 时,这些不是新创建的精灵,而是您之前添加的相同精灵,因此会出现消息“尝试添加已经有父节点的 SKNode”

在设计用于生成节点的函数中,您通常会创建一个新的 SKNode 来每次生成,就像注释掉的代码行一样:

// let cloud1 = SKSpriteNode(imageNamed: "CLOUD")

这将确保 cloud1 每次都是一个新节点。

您也应该为 cloud2 这样做。

【讨论】:

    【解决方案2】:

    两件事,第一是动作应该是一个序列。

       // let action = SKAction.repeat( block, count: 10)
         let action = SKAction.repeat( SKAction.sequence( [block,wait]), count: 10)
    

    秒,9s左右的时间应该是完美的,即self.frame.height / 15

       //let moveCloud = SKAction.move(by: CGVector(dx:0, dy:25 * self.frame.width), duration: TimeInterval(self.frame.height / 15 ))
    

    所以这可能是:

      let moveCloud = SKAction.move(by: CGVector(dx:0, dy:2.5 * self.frame.width), duration: TimeInterval(self.frame.height / 150 ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-23
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多