ios - sprite not being removed with SKAction
问题描述
I am trying clouds move up and spawn but I keep getting
'terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: name:'(null)' texture:[ 'CLOUD' (746 x 497)] position:{198.66667175292969, 1227.987060546875} scale:{0.30, 0.30} size:{223.80000305175781, 149.10000610351562} anchor:{0.5, 0.5} rotation:0.00'. '
I'm not sure what's going wrong any help would be much appreciated
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()
}
}
}
解决方案
cloud1 和 cloud2 是属性,即随处可见。因此,当您这样做时addChild(cloud1)
,addChild(cloud2)
这些不是新创建的精灵,而是您之前添加的精灵,因此出现消息“尝试添加已经有父节点的 SKNode”
在设计用于生成节点的函数中,您通常会创建一个新的 SKNode 来每次生成,就像注释掉的代码行一样:
// let cloud1 = SKSpriteNode(imageNamed: "CLOUD")
这将确保 cloud1 每次都是一个新节点。
您也应该为 cloud2 执行此操作。
推荐阅读
- sharepoint - 使用 sharepoint 搜索 API,如何在我的 sharepoint 租约内检索所有站点内的所有文档?
- azure-maps - PostRouteDirections 不会从路线中排除区域
- ibm-integration-bus - 如何在 JCN 中访问 XML 结构
- sql - Oracle 查询返回单行
- amazon-web-services - AWS 无服务器框架:创建 IAM 角色和策略时出现 MalformedPolicyDocument 错误
- powerbi - Power Bi:从 url 填充源查询中使用的参数
- javascript - 以编程方式调整 PNG 的大小
- excel - 使用单元格中的文本值作为公式
- php - 使用 PHP header:location 时下载速度慢
- android - 使用 Android Studio 录制屏幕视频的问题