Как удалить узел, когда он выходит за пределы сцены в Sprite Kit

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

if( CGRectIntersectsRect(node.frame, view.frame) ) {
   // Don't delete your node
} else {
   // Delete your node as it is not in your view
}

но, похоже, не работает, любая помощь будет оценена


person RUON    schedule 31.08.2015    source источник
comment
Вы написали комментарий, чтобы удалить узел... конечно, это не работает :-)   -  person Luca Angeletti    schedule 01.09.2015
comment
hhhh, код node.removeFromParent() слишком очевиден, поэтому я его не набирал   -  person RUON    schedule 01.09.2015
comment
Хорошо :) Итак, следующий вопрос, куда вы поместили этот код?   -  person Luca Angeletti    schedule 01.09.2015
comment
я думаю, может быть, это проблема, я поместил его в метод didmovetoview, я не знаю, куда я должен его поместить   -  person RUON    schedule 01.09.2015
comment
Да, это проблема. Пожалуйста, взгляните на мой ответ и дайте мне знать, решит ли он вашу проблему.   -  person Luca Angeletti    schedule 01.09.2015


Ответы (1)


Это не лучший подход с точки зрения производительности, но если вы переопределите метод update в своей сцене, вы сможете написать код, который будет выполняться в каждом кадре.

class GameScene : SKScene {

    var arrow : SKSpriteNode?

    override func update(currentTime: NSTimeInterval) {
        super.update(currentTime)

        if let
            arrow = arrow,
            view = self.view
        where
            CGRectContainsRect(view.frame, arrow.frame) == false &&
            CGRectIntersectsRect(arrow.frame, view.frame) == false {
                arrow.removeFromParent()
        }
    }
}

Соображения

Имейте в виду, что каждый код, который вы пишете в методе обновления, выполняется каждый кадр (60 раз в секунду в игре со скоростью 60 кадров в секунду), поэтому вам следует быть очень осторожным с этим. Типичные вещи, которые вы не хотите писать внутри update, если в этом нет крайней необходимости:

  1. создание объектов
  2. большие циклы
  3. рекурсивные вызовы
  4. любой сумасшедший код, который требует слишком много времени для выполнения

Надеюсь это поможет.

person Luca Angeletti    schedule 31.08.2015
comment
я выразился, как вы сказали, но это дает мне фатальную ошибку компиляции: неожиданно найден ноль при развертывании необязательного значения - person RUON; 01.09.2015
comment
Вы поместили его в свою сцену? - person Luca Angeletti; 01.09.2015
comment
Хорошо, как объявляется node? Что-то вроде var node: SKNode! ? - person Luca Angeletti; 01.09.2015
comment
var arrow : SKSpriteNode! - person RUON; 01.09.2015
comment
спасибо и извините, если я беспокою работу, это кажется работой, но она удаляет ее внутри сцены, прежде чем она выйдет за ее пределы - person RUON; 01.09.2015
comment
Да, это происходит потому, что CGRectIntersectsRect проверяет пересечение прямоугольника сцены и прямоугольника, содержащего ваш спрайт. Я собираюсь обновить свой ответ, но вам нужно будет его проверить. - person Luca Angeletti; 01.09.2015
comment
Удачи в игре ;-) - person Luca Angeletti; 01.09.2015