2014-11-03 5 views
1

Im пытается удалить SKSpriteNodes из родителя, "self". Я создаю узлы через цикл for внутри функции, которую я вызываю каждый раз, когда мне нужно обновлять количество узлов. Эти узлы представляют количество жизней, которые игрок имеет внутри игры.Удаление SKSpiteNode от родителя

func starsSpwan() { 
    self.starNode.removeFromParent() 
    var spaceInX:CGFloat = 0 
    for var i = 0; i<gameLife; i=i+1 { 

     starsTexture = SKTexture(imageNamed: "star") 
     starsTexture.filteringMode = SKTextureFilteringMode.Nearest 
     starNode = SKSpriteNode(texture: starsTexture) 
     starNode.zPosition = 30 
     starNode.size = CGSize(width: 30, height: 30) 
     starNode.position = CGPoint(x: CGRectGetMinX(self.frame) + 30 + spaceInX, y: CGRectGetMinY(self.frame) + 30) 
     self.addChild(starNode) 
     println(starNode) 
     spaceInX = spaceInX + 40 
    } 

} 

В основном переменная gameLife решает, сколько звезд добавить. Я добавляю self.starNode.removeFromParent() в начале, потому что, если игрок теряет жизнь, я хочу сначала удалить все 3 звезды, а затем снова добавить только 2 звезды и так далее.

Моя проблема в том, что в настоящее время это работает только в первый раз, когда пользователь теряет жизнь. узлы удаляются, а 2 звезды добавляются снова. Но если игрок снова теряет жизнь, узлы не удаляются, а дополнительный узел добавляется. Тем не менее это незаметно, потому что узел добавляется поверх существующего узла.

Новый код по-прежнему не работает правильно

func starsSpwan() { 

    self.nodeStar.removeFromParent() 
    var spaceInX:CGFloat = 0 

    for var i = 0; i<gameLife; i=i+1 { 

     starsTexture = SKTexture(imageNamed: "star") 
     starsTexture.filteringMode = SKTextureFilteringMode.Nearest 
     starNode = SKSpriteNode(texture: starsTexture) 
     starNode.zPosition = 30 
     starNode.size = CGSize(width: 20, height: 20) 
     starNode.position = CGPoint(x: CGRectGetMinX(self.frame) + 30 + spaceInX, y: CGRectGetMinY(self.frame) + 30) 
     starNode.name = "stars" 
     self.addChild(starNode) 
     println(starNode) 
     spaceInX = spaceInX + 40 
     nodeStar = self.childNodeWithName("stars")! 

    } 

} 
+0

не очевидно? У вас есть одна переменная starNode, которая содержит ссылку на один спрайт, поэтому вы можете удалить только один спрайт (тот, который был создан последним). Вам понадобится массив или пометьте ваши спрайты, а затем перечислите их с помощью функции поиска узлов. – LearnCocos2D

+0

Как удалить все спрайты? –

+0

Вы можете назначить имя спрайтам с помощью starNode.name = "starNode", а затем удалить спрайты с let node = self.childNodeWithName ("starNode") и node? .removeFromParent() – 0x141E

ответ

1

Попробуйте следующее ...

func starsSpawn() { 
    // Remove all sprites named "stars" 
    self.enumerateChildNodesWithName("stars") { 
     node, stop in 
     node.removeFromParent(); 
    } 
    var spaceInX:CGFloat = 0 

    for var i = 0; i<gameLife; i=i+1 { 

     starsTexture = SKTexture(imageNamed: "star") 
     starsTexture.filteringMode = SKTextureFilteringMode.Nearest 
     starNode = SKSpriteNode(texture: starsTexture) 
     starNode.zPosition = 30 
     starNode.size = CGSize(width: 20, height: 20) 
     starNode.position = CGPoint(x: CGRectGetMinX(self.frame) + 30 + spaceInX, y: CGRectGetMinY(self.frame) + 30) 
     starNode.name = "stars" 
     self.addChild(starNode) 
     println(starNode) 
     spaceInX = spaceInX + 40 
    } 
} 
Смежные вопросы