2014-12-04 4 views
0

У меня есть несколько программно сделанных SKSpriteNode. Некоторые из них я хочу перемещаться, некоторые из них хотят быть статичными (имеют фиксированную позицию). При добавлении физики к узлам (нужно, чтобы иметь возможность обнаружения конфликтов, правильно?) И установите physicsBodyXXXX.dynamic = false, они остаются в том же положении, когда перемещают другой объект над ними. Хорошо!Как сделать SKSpriteNode с фиксированным положением (после добавления физики)?

Но, я все еще могу захватить узел, который я хочу статически позиционировать, и перемещать их. Как я могу замаскировать узел, который я не хочу перемещать в функции touch? Или есть другое решение?

Пытался найти недвижимость как static, который сделал положение узла фиксированной, но не могу найти его ...

Вот мой код для авто генераторных узлов (в override func didMoveToView(view: SKView):

for Character in englishWord{ 

    // Make letters: 
    let letterToMove = SKSpriteNode(imageNamed: "\(Character)") 
    //then setting size and position 
    var physicsBodyLetterToMove = SKPhysicsBody(rectangleOfSize: letterToMove.size) 
    physicsBodyLetterToMove.affectedByGravity = false 
    physicsBodyLetterToMove.allowsRotation = false 
    physicsBodyLetterToMove.dynamic = false 
    letterToMove.physicsBody = physicsBodyLetterToMove 

    self.addChild(letterToMove) 

    // Make empty boxes for the letters: 
    let letterRecBox = SKSpriteNode(imageNamed: "EmptyBox") 
    //then setting size and position 
    var physicsBodyLetterRecBox = SKPhysicsBody(rectangleOfSize: letterRecBox.size) 
    physicsBodyLetterToMove.affectedByGravity = false    
    physicsBodyLetterRecBox.dynamic = false 
    letterRecBox.physicsBody = physicsBodyLetterRecBox 

    self.addChild(letterRecBox) 
} 

Так Прикосновения функ-х:

var selected: [UITouch: SKNode] = [:] 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 

    selected = [:] 
    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 
     selected[touch as UITouch] = nodeAtPoint(location) 
    } 
} 

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 
    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 

     for (touch, node) in selected{ 
      if !contains([self], node){ 
       let action = SKAction.moveTo(location, duration: 0.1) 
       node.runAction(SKAction.repeatAction(action, count: 1)) 
      } 
     } 

    } 

} 

Любая идея

ответ

0

Настройка динамического на false приведет к тому, что узел не будет затронут физикой. SKActions и события касания не считаются физическими, поэтому они все равно будут влиять на ваши узлы, которые не являются динамическими.

Вы могли бы сделать что-то вроде:

YourSpriteNode.name = @"staticNode"; //Right after you create it 

затем изменить ваш метод касания:

for (touch, node) in selected{ 
     if !contains([self], node){ 
      if(![node.name isEqualToString:@"staticNode"]) 
      { 
       let action = SKAction.moveTo(location, duration: 0.1) 
       node.runAction(SKAction.repeatAction(action, count: 1)) 
      } 
     } 
    } 

Нововведенных, если заявление будет предотвратить любой узел с именем «staticNode» от получения переехали из-за ваших SKActions , Другие узлы будут двигаться, как ожидалось.

0

Thanx, который сработал.

Только я должен был написать это так:

letterRecBox.name = "staticNode" 

... 

if !(node.name == "staticNode"){ 
    ...then do something... 
}