Swift:尝试添加一个已经有父节点的 SKNode:
Posted
技术标签:
【中文标题】Swift:尝试添加一个已经有父节点的 SKNode:【英文标题】:Swift: Attemped to add a SKNode which already has a parent: 【发布时间】:2016-05-09 15:16:53 【问题描述】:我知道为什么会出现该错误,但我想不出解决办法。我试图让对象出现然后被删除,玩家应该在它们被删除之前尝试点击它们,但是每次下一个节点即将出现时它都会崩溃。如果我在它的 func 中声明它,那么它就会全部出来,但我无法点击它......
代码:
let step = SKSpriteNode()
override func didMoveToView(view: SKView)
physicsWorld.contactDelegate = self
backgroundColor = UIColor.feelFreeToColor()
self.color = self.randomNumbersInt(3)
self.showBars()
self.showScore()
let spawn = SKAction.runBlock
//self.color = self.randomNumbersInt(3)
self.showSteps()
let delay = SKAction.waitForDuration(1.5)
let spawnDelay = SKAction.sequence([spawn , delay])
let spawnDelayForever = SKAction.repeatActionForever(spawnDelay)
self.runAction(spawnDelayForever)
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
for touch in touches
var location = touch.locationInNode(self)
if self.nodeAtPoint(location) == step
self.score += 1
func showSteps()
let createSteps = SKAction.moveByX(0, y: -self.frame.height - 30 , duration: 10)
let removeSteps = SKAction.removeFromParent()
step.color = colors[randomNumbersInt(3)]!
step.size = CGSize(width: 275, height: 30)
step.position = CGPoint(x: self.frame.width * 0.5, y: self.frame.height * 0.75)
step.physicsBody = SKPhysicsBody(rectangleOfSize: step.size)
step.physicsBody?.categoryBitMask = Config.PhysicBodyType.Steps.rawValue
step.physicsBody?.affectedByGravity = false
step.physicsBody?.dynamic = false
step.zPosition = 1
step.runAction(SKAction.repeatActionForever(SKAction.sequence([createSteps, removeSteps])))
addChild(step)
【问题讨论】:
Related. 在发布之前我已经看到了,甚至不是同一个问题。我知道,如果我想重新添加相同的 sknode,我必须在函数中声明所有内容,但我需要在该函数之外访问它,同时它正在创建和删除 sknode...@Gliderman 【参考方案1】:在您的showSteps
函数中,在其中声明step
节点,而不是在您的代码顶部,同时给它一个name
:
func showSteps()
let step = SKSpriteNode()
...
step.name = "step"
step.color = colors[randomNumbersInt(3)]!
// etc
在你的touchesBegan
方法中,你有这个if
声明:
if self.nodeAtPoint(location) == step
self.score += 1
你想删除你点击的那个节点,但现在你可以像这样检查name
属性:
if self.nodeAtPoint(location)?.name == "step"
self.nodeAtPoint(location)?.removeFromParent()
self.score += 1
请注意,我对 Swift 不是超级流利,但我认为您可能需要在您的 if
语句中使用 ?
,因为它可能不存在(例如,如果您没有点击特定节点)。更熟悉 Swift 的人可以免费纠正我。
【讨论】:
是否可以访问颜色等其他属性?如果我点击我希望它改变颜色。 @MohamedMohamed 应该是,不过我现在无法测试。 在哪里可以找到更多相关信息?对 swift 来说相当新。我需要访问该 sknode(感谢您!)并让它与它的颜色相同。 @MohamedMohamed 好吧,here is Apple's documentation on SKSpriteNodes。 *** 并不是一个真正的推荐网站,但有数百(数千?)关于 Swift 的教程,您可能能够通过仔细措辞您想要了解的内容,在网络搜索中缩小范围。跨度> 感谢您的帮助!我会从这里开始搜索。以上是关于Swift:尝试添加一个已经有父节点的 SKNode:的主要内容,如果未能解决你的问题,请参考以下文章
Swift SpriteKit - “尝试添加一个已经有父节点的 SKNode”,同时添加关节
SpriteKit: NSInvalidArgumentException - 试图添加一个已经有父节点的 SKNode