2015-08-29 3 views
1

Мое приложение (Swift 2) не удаляет какие-либо узлы, когда они отваливаются от сцены. В конечном итоге они занимают место и сокращают частоту кадров. Мой код можно найти по адресу https://github.com/Ph0enix0/Loominarty-Confirmed/blob/master/Loominarty%20Confirmed/GameScene.swift Спасибо!SKSpriteNode не удаляет, когда падает с сцены

+0

Код, который вы связали, ничего не делает, кроме вращающихся спрайтов, означает, что они никогда не покидают экран. В любом случае, если вы хотите удалить узел из родителя после его выхода из экрана, вы можете сделать это несколькими способами: 1) использовать метод intersectsNode(), 2) использовать последовательность действий (и удалить узел после определенного события), 3) использовать физика граничит вокруг сцены и обнаруживает контакты, которые укажут, что узел находится вне экрана. Вы можете начать здесь: http://stackoverflow.com/q/30551951/3402095 – Whirlwind

+0

Дерьмо, извините. Я использовал неправильный файл. Загрузка файлов проекта. Проклятый github для mac взял мировую программу hello по умолчанию на xcode. –

+0

Исправлено! Я забыл нажать кнопку синхронизации на github для mac. Хорошая работа, я. –

ответ

1

Для вашей ситуации, исходя из того, как вы перемещаете пулю, самым простым решением будет использование последовательности действий. Как это:

func SpawnBullets(){ 
    var bullet = SKSpriteNode(color: SKColor.orangeColor(), size: CGSize(width: 10, height: 20)) 
    bullet.zPosition = -5 
    bullet.position = CGPointMake(player.position.x, player.position.y) 



    let action = SKAction.moveToY(self.size.height + 30.0, duration: 0.6) 

    let remove = SKAction.runBlock({bullet.removeFromParent(); println("Bullet removed from scene")}) 

    let sequence = SKAction.sequence([action,remove]) 

    bullet.runAction(sequence) 

    bullet.physicsBody = SKPhysicsBody(rectangleOfSize: bullet.size) 
    bullet.physicsBody?.categoryBitMask = physCat.bullet 
    bullet.physicsBody?.contactTestBitMask = physCat.enemy 
    bullet.physicsBody?.affectedByGravity = false 
    bullet.physicsBody?.dynamic = false 

    self.addChild(bullet) 
} 

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

+0

я бы удалил 'bullet.runAction (SKAction.repeatActionForever (action))', или вы забыли добавить эту строку? –

+0

Удаление вышеупомянутой линии помешало бы врагам размножаться. Спасибо! –

+0

На самом деле вам не требуется repeatActionForever. Просто скопируйте и вставьте мой код. В основном вы создаете действие для перемещения маркера из точки A в точку B. Не нужно повторять это навсегда. Также подумайте, не использовать NSTimer для повторения нереста ... Вы должны делать все это с помощью действий. NSTimer не учитывает приостановленное состояние сцены, узла или представления. – Whirlwind

Смежные вопросы