2014-09-27 3 views
0

Я хочу удалить все объекты из экрана. На данный момент я использую обнаружение контакта с «барьерами».Определите, когда SpriteNode покидает экран?

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

Знаете ли вы, есть ли простой способ удалить все объекты из экрана?

Вот мой код с барьерами:

// declarations 
var barrierLeft:SKSpriteNode = SKSpriteNode() 
var barrierRight:SKSpriteNode = SKSpriteNode() 
var barrierTop:SKSpriteNode = SKSpriteNode() 

// In didMoveToView method 
barrierLeft.size = CGSizeMake(1, self.frame.height*2) 
barrierLeft.physicsBody = SKPhysicsBody (rectangleOfSize: barrierLeft.size) 
barrierRight.position = CGPointMake(0, 0) 

barrierLeft.physicsBody?.dynamic = false 
barrierLeft.physicsBody?.categoryBitMask = barrierCategory 
barrierLeft.physicsBody?.contactTestBitMask = flechetteCategory 
addChild(barrierLeft) 

barrierRight.size = CGSizeMake(1, self.frame.height*2) 
barrierRight.physicsBody = SKPhysicsBody (rectangleOfSize: barrierLeft.size) 
barrierRight.position = CGPointMake(self.size.width+10, 0) 
barrierRight.physicsBody?.dynamic = false 
barrierRight.physicsBody?.categoryBitMask = barrierCategory 
barrierRight.physicsBody?.contactTestBitMask = flechetteCategory 
addChild(barrierRight) 

//  
func didBeginContact(contact: SKPhysicsContact!) 
{ 
    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 


    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
    { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 

    } 
    else 
    { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if ((firstBody.categoryBitMask & flechetteCategory) != 0 && (secondBody.categoryBitMask & barrierCategory) != 0) 
    { 
     flecheDidCollideWithbarrier(firstBody.node as SKSpriteNode, barrier: secondBody.node as SKSpriteNode) 
    } 

// 

func flecheDidCollideWithbarrier (fleche: SKSpriteNode, barrier: SKSpriteNode) 
{ 
    println("barrière") 
    counterGainTime = 0 
    fleche.removeFromParent() 


} 

Спасибо за вашу помощь!

ответ

6

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

override func update(currentTime: CFTimeInterval) { 
    // Loop over all nodes in the scene 
    self.enumerateChildNodesWithName("*") { 
     node, stop in 
     if (node is SKSpriteNode) { 
      let sprite = node as SKSpriteNode 
      // Check if the node is not in the scene 
      if (sprite.position.x < -sprite.size.width/2.0 || sprite.position.x > self.size.width+sprite.size.width/2.0 
       || sprite.position.y < -sprite.size.height/2.0 || sprite.position.y > self.size.height+sprite.size.height/2.0) { 
        sprite.removeFromParent() 
      } 
     } 
    } 
} 
+0

У меня проблема с вашим решением. – Haox

+0

В чем проблема? – 0x141E

+0

У меня проблема. Мое обновление функции уже используется для функции интервалов. Когда я добавляю ваш метод в func update, узел не удаляется. И когда каждый узел убирает экран, он добавляет +1 к моему счету. Мой счет рассчитывается на каждом контакте между двумя телами. Я не могу понять связь между вашим методом и моим счетом. Кроме того, я редактирую ваш метод вне обновления func следующим образом: if (node.position.x <0 || node.position.x> self. Size.width) || node.position.y <0 || node.position.y> self.size.height) {node.removeFromParent()} метод работает, но не все время. Вы можете мне помочь? – Haox

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