eption 'NSInvalidArgumentException', 原因:'试图添加一个已经有父节点的 SKNode
eption 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent
我想不通这个问题。我删除了某个 SpriteNode,而不是有时在某个条件下重新添加它,但是每次我调用 addChild() 时它都会崩溃。我知道一个 SpriteNode 只能有一个父节点,所以我不明白这一点。这是相关代码:
override func touchesBegan(touches: NSSet, withEvent event:UIEvent) {
var touch: UITouch = touches.anyObject() as UITouch
var location = touch.locationInNode(self)
var node = self.nodeAtPoint(location)
for var i=0; i < tileNodeArray.count; i++
{
if (node == tileNodeArray[i]) {
flippedTilesCount++;
flippedTilesArray.append(tileNodeArray[i])
let removeAction = SKAction.removeFromParent()
tileNodeArray[i].runAction(removeAction)
if flippedTilesCount == 2
{
var helperNode1 = newMemoLabelNode("first",x: 0,y: 0,aka: "first")
var helperNode2 = newMemoLabelNode("second",x: 0,y: 0,aka: "second")
for var k = 0; k < labelNodeArray.count ;k++
{
if labelNodeArray[k].position == flippedTilesArray[0].position
{
helperNode1 = labelNodeArray[k]
}
if labelNodeArray[k].position == flippedTilesArray[1].position
{
helperNode2 = labelNodeArray[k]
}
}
if helperNode1.name == helperNode2.name
{
erasedTiles = erasedTiles + 2;
}
else
{
for var j = 0; j < flippedTilesArray.count ;j++
{
let waitAction = SKAction.waitForDuration(1.0)
flippedTilesArray[j].runAction(waitAction)
//self.addChild(flippedTilesArray[j]);
}
}
flippedTilesCount = 0;
flippedTilesArray = []
println("erased tiles:")
println(erasedTiles)
}
}
}
}
感谢您的帮助!
我建议您不要使用 SKAction.removeFromParent
,而是通过调用删除节点本身:
tileNodeArray[i].removeFromParent()
而不是:
let removeAction = SKAction.removeFromParent()
tileNodeArray[i].runAction(removeAction)
问题可能是 SKAction 不等待彼此完成。例如,如果您调用 waitAction,则其他操作将保持 运行.
我想不通这个问题。我删除了某个 SpriteNode,而不是有时在某个条件下重新添加它,但是每次我调用 addChild() 时它都会崩溃。我知道一个 SpriteNode 只能有一个父节点,所以我不明白这一点。这是相关代码:
override func touchesBegan(touches: NSSet, withEvent event:UIEvent) {
var touch: UITouch = touches.anyObject() as UITouch
var location = touch.locationInNode(self)
var node = self.nodeAtPoint(location)
for var i=0; i < tileNodeArray.count; i++
{
if (node == tileNodeArray[i]) {
flippedTilesCount++;
flippedTilesArray.append(tileNodeArray[i])
let removeAction = SKAction.removeFromParent()
tileNodeArray[i].runAction(removeAction)
if flippedTilesCount == 2
{
var helperNode1 = newMemoLabelNode("first",x: 0,y: 0,aka: "first")
var helperNode2 = newMemoLabelNode("second",x: 0,y: 0,aka: "second")
for var k = 0; k < labelNodeArray.count ;k++
{
if labelNodeArray[k].position == flippedTilesArray[0].position
{
helperNode1 = labelNodeArray[k]
}
if labelNodeArray[k].position == flippedTilesArray[1].position
{
helperNode2 = labelNodeArray[k]
}
}
if helperNode1.name == helperNode2.name
{
erasedTiles = erasedTiles + 2;
}
else
{
for var j = 0; j < flippedTilesArray.count ;j++
{
let waitAction = SKAction.waitForDuration(1.0)
flippedTilesArray[j].runAction(waitAction)
//self.addChild(flippedTilesArray[j]);
}
}
flippedTilesCount = 0;
flippedTilesArray = []
println("erased tiles:")
println(erasedTiles)
}
}
}
}
感谢您的帮助!
我建议您不要使用 SKAction.removeFromParent
,而是通过调用删除节点本身:
tileNodeArray[i].removeFromParent()
而不是:
let removeAction = SKAction.removeFromParent()
tileNodeArray[i].runAction(removeAction)
问题可能是 SKAction 不等待彼此完成。例如,如果您调用 waitAction,则其他操作将保持 运行.