Как заставить что-то делать только одного ребенка после использования enumerateChildNodesWithName?

Я использовал команду enumerateChildNodesWithName, чтобы придать физику всем своим блокам, например:

    func findBlock(theName:String){

        self.enumerateChildNodesWithName("//*"){
        node, stop in

            if node.name == theName{
                node.physicsBody?.categoryBitMask = physicsCategory.block
                node.physicsBody?.collisionBitMask = physicsCategory.laser
                node.physicsBody?.contactTestBitMask = physicsCategory.laser
            } 
        }
    }

И теперь я хочу, чтобы только один из блоков исчезал при попадании лазера. Однако мне не удалось добиться этого без одновременного исчезновения всех остальных блоков.
Я попытался использовать эту строку кода в didBeginContact, чтобы найти блок, представляющий первое тело, и удалить его:

if firstBody.categoryBitMask == physicsCategory.block && secondBody.categoryBitMask == physicsCategory.laser{

        let block = SKSpriteNode()
        block.physicsBody = firstBody
        block.alpha = 1
        let byeBlock = SKAction.fadeOutWithDuration(0.5)
        let gone = SKAction.removeFromParent()
        let run = SKAction.sequence([byeBlock, gone])
        block.runAction(run)
        self.removeChildrenInArray([laser])

    }

но это тоже не сработало. Пожалуйста помоги! Заранее спасибо!


person Jason Gaffney    schedule 24.04.2016    source источник
comment
И какой код, когда блок попал под лазер? Я предполагаю, что вы справитесь с этим в didBeginContact...   -  person Whirlwind    schedule 24.04.2016
comment
@Whirlwind это в didBeginContact. Сначала я попытался использовать ту же команду enumerateChildNodesWithName для удаления блока, но, очевидно, это удалило все блоки на экране. Совсем недавно я попробовал эту строку кода:   -  person Jason Gaffney    schedule 24.04.2016
comment
if firstBody.categoryBitMask == physicsCategory.block && secondBody.categoryBitMask == physicsCategory.laser{ let block = SKSpriteNode() block.physicsBody = firstBody block.alpha = 1 let byeBlock = SKAction.fadeOutWithDuration(0.5) let got = SKAction.removeFromParent () let run = SKAction.sequence([byeBlock, ушел]) block.runAction(run) self.removeChildrenInArray([лазер]) }   -  person Jason Gaffney    schedule 24.04.2016
comment
Но это тоже не работает.   -  person Jason Gaffney    schedule 24.04.2016
comment
Использование этого кода (где вы перечисляете все узлы) в didBeginContact неправильно (если вы не хотите удалять все блоки). Правильным способом было бы проверить, какое тело представляет собой блок, и удалить его. Здесь на SO действительно много сообщений, в которых описывается, как обращаться с didBeginContact. Просто воспользуйтесь поиском и дайте мне знать, если у вас возникнут дальнейшие проблемы. Кроме того, пожалуйста, не вставляйте много кода в комментарии. Вы должны обновить свой вопрос с дальнейшими изменениями. Код в комментариях не читается.   -  person Whirlwind    schedule 24.04.2016
comment
Вот хорошее объяснение битовых масок. stackoverflow.com/q/34904564/3402095 И хорошие сообщения о том, как реализовать метод didBeginContact: stackoverflow.com/a/26723392/3402095, стекпоток. com/a/26443216/3402095 (‹- это будет самым простым решением для вас).   -  person Whirlwind    schedule 24.04.2016


Ответы (1)


Я предполагаю, что вы обрабатываете контакты как следует, так что предоставленный вами блок if работает правильно. Если это так, это то, что вы хотите:

if firstBody.categoryBitMask == physicsCategory.block && secondBody.categoryBitMask == physicsCategory.laser{
{
    //Downcast it to SKSpriteNode or whatever your block is
    if let block = firstBody.node as? SKSpriteNode {

        //We don't want to run removing action twice on the same block
        if block.actionForKey("removing") == nil {

            block.alpha = 1
            let fadeOut = SKAction.fadeOutWithDuration(0.5)
            let remove = SKAction.removeFromParent()
            block.runAction(SKAction.sequence([fadeOut, remove]), withKey: "removing")
        }

    }
    //Downcast it to SKSpriteNode or whatever your laser is
    if let laser = secondBody.node as? SKSpriteNode {
        self.removeChildrenInArray([laser])
    }

}
person Whirlwind    schedule 24.04.2016