Как сделать так, чтобы мои SK-узлы столкнулись только один раз? У меня есть система частиц, которая появляется, когда они сталкиваются, но если они снова сталкиваются, появляется сгусток. Я не хочу этого. Просто хочу один, вот и все. Как я могу снять этот эффект?

if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 3 || bodyA.categoryBitMask == 3 && bodyB.categoryBitMask == 1 {
        print("END GAME")


        if let dieexplostionNode = SKEmitterNode(fileNamed: "Explosion.sks"){
                dieexplostionNode.targetNode = self
                dieexplostionNode.position = player.position

                // add 3 actions
                let wait = SKAction.wait(forDuration: 1.1)
                let addExplosion = SKAction.run {
                    self.player.addChild(dieexplostionNode)
                    self.player.alpha = 0
                }
                let removePlayer = SKAction.run {
                    self.player.removeFromParent()
                    self.player.removeAllActions()
                    dieexplostionNode.removeFromParent()

                }

                // put them in a sequence.
                let seq = SKAction.sequence([addExplosion,wait,removePlayer])

                // run the sequence
                self.run(seq)

            }
1
Matt Cantrelle 11 Июл 2017 в 03:42
На ум приходят две идеи. Измените что-нибудь в узлах (либо категории, либо растровое изображение или тип категории / столкновения физического тела) при возникновении столкновения, чтобы вы не запускали взрыв снова или просто отслеживали, запустили ли вы взрыв с другой переменной.
 – 
Gary Makin
11 Июл 2017 в 04:22
Очень хорошая идея! Спасибо, чувак, я это очень ценю. Я пытался придумать что-то подобное. Я буду менять категорию, поэтому не имеет значения, столкнется ли она снова. Спасибо!!
 – 
Matt Cantrelle
11 Июл 2017 в 05:23

1 ответ

Лучший ответ

Ваша проблема в том, что может произойти несколько контактов, поэтому вам нужно поставить отметку в своем коде, чтобы сообщить вашей системе, что вы уже оцениваете контакт и не хотите проводить какую-либо другую оценку. Я предпочитаю зарезервировать бит 31 во флаге битовой маски категории, и если он установлен, не оценивать.

guard bodyA.categoryBitMask < 1 << 31 && bodyB.categoryBitMask < 1 << 31 else {return}

if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 3 || bodyA.categoryBitMask == 3 && bodyB.categoryBitMask == 1 {
        print("END GAME")
        player.categoryBitMask += 1<<31

        if let dieexplostionNode = SKEmitterNode(fileNamed: "Explosion.sks"){
                dieexplostionNode.targetNode = self
                dieexplostionNode.position = player.position

                // add 3 actions
                let wait = SKAction.wait(forDuration: 1.1)
                let addExplosion = SKAction.run {
                    self.player.addChild(dieexplostionNode)
                    self.player.alpha = 0
                }
                let removePlayer = SKAction.run {
                    self.player.removeFromParent()
                    self.player.removeAllActions()
                    dieexplostionNode.removeFromParent()

                }

                // put them in a sequence.
                let seq = SKAction.sequence([addExplosion,wait,removePlayer])

                // run the sequence
                self.run(seq)

            }
2
Knight0fDragon 11 Июл 2017 в 15:56