尝试添加一个已经有父错误的 SKNode
Posted
技术标签:
【中文标题】尝试添加一个已经有父错误的 SKNode【英文标题】:Attemped to add a SKNode which already has a parent error 【发布时间】:2015-02-09 09:38:23 【问题描述】:我在尝试运行我的游戏时收到错误消息:“尝试添加一个已经有父节点的 SKNode”。
如果我将 SKSpriteNode 本地添加到函数中,它运行良好。但是当我尝试全局声明它时,我得到了那个错误。解决此错误的任何帮助都会很棒。我认为它与self.bee.removeFromParent()
有关,但我无法让它工作。
让bee = SKSpriteNode(imageNamed: "Bee")
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addBee),
SKAction.waitForDuration(0.5)
])
))
func addBee()
bee.name = "Bee"
let actualY = random(min: 0, max: size.height+bee.size.height ) // random
bee.position = CGPoint(x: size.width + bee.size.width/2, y: actualY)
self.addChild(bee)
let slopeToPlayer = (bee.position.y - player.position.y) / (bee.position.x - player.position.x)
let constant = bee.position.y - slopeToPlayer * bee.position.x
let finalX : CGFloat = bee.position.x < player.position.x ? 500.0 : -500.0 // Set it to somewhere outside screen size
let finalY = constant + slopeToPlayer * finalX
let distance = (bee.position.y - finalY) * (bee.position.y - finalY) + (bee.position.x - finalX) * (bee.position.x - finalX)
let beeSpeed = random(min: CGFloat(50), max: CGFloat(150))
let timeToCoverDistance = sqrt(distance) / beeSpeed
let moveAction = SKAction.moveTo(CGPointMake(finalX, finalY), duration: NSTimeInterval(timeToCoverDistance))
let removeAction = SKAction.runBlock () -> Void in
self.bee.removeFromParent()
bee.runAction(SKAction.sequence([moveAction,removeAction]))
【问题讨论】:
【参考方案1】:您不能将同一 SKNode
的单个实例添加两次。这就像说一个人可以同时存在于两个地方。
当您在全局范围内创建Bee node
时,在addBee
函数的范围之外,您正试图一次又一次地添加Bee
的相同实例。
如果要添加多个节点,则应创建单独的节点实例。这就是为什么从函数内部本地创建它们的原因。
func addBee()
let bee = SKSpriteNode(imageNamed: "Bee")
bee.name = "Bee"
addChild(bee)
获取碰撞节点的参考。
func didBeginContact(contact: SKPhysicsContact)
var bodyA : SKPhysicsBody!
var bodyB : SKPhysicsBody!
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask
bodyA = contact.bodyA!
bodyB = contact.bodyB!
else
bodyB = contact.bodyA!
bodyA = contact.bodyB!
// The two nodes that have collided
let node1 = bodyA.node
let node2 = bodyB.node
【讨论】:
那么我将如何在全局范围内创建它们,以便在编写碰撞检测时可以引用它们?你给我的代码是我以前的代码,工作正常,但我不能在另一个函数中引用bee,因为它只存在于addBee()中。 当从 SKPhysicsBody.node 属性调用时,您将获得在didContactBegin
函数内碰撞的节点的引用。这还不够吗?
感谢您迄今为止的帮助!在过去的几天里,我一直在尝试将此代码添加到碰撞中,但我无法让它工作!我现在要做的就是在检测到玩家和蜜蜂之间发生碰撞时 println("Game Over")。
将player.physicsBody?.contactTestBitMask
设置为beeCategory,将bee.physicsBody?.contactTestBitMask
设置为playerCategory,并使用我上面给出的代码。
好的,谢谢,我想我现在有了。然而,现在蜜蜂和蜜蜂受到物理的影响,当两个单独的蜜蜂物体碰撞时会移动和改变路线。 编辑 修复它,我遗漏了`bee.physicsBody?.collisionBitMask = PhysicsCategory.None`以上是关于尝试添加一个已经有父错误的 SKNode的主要内容,如果未能解决你的问题,请参考以下文章
Swift SpriteKit - “尝试添加一个已经有父节点的 SKNode”,同时添加关节
SpriteKit: NSInvalidArgumentException - 试图添加一个已经有父节点的 SKNode