2014-12-04 13 views
0

프로그래밍 방식으로 SKSpriteNode를 여러 개 만들었습니다. 그들 중 일부는 주위를 돌아 다니고 싶습니다. 일부는 고정되어 있어야합니다 (고정 된 위치를 가짐). 노드에 물리를 추가 할 때 (충돌 감지를 수행 할 수 있어야합니까?) physicsBodyXXXX.dynamic = false을 설정하면 다른 객체를 이동할 때 동일한 위치에 머무르게됩니다. 괜찮아!고정 된 위치로 SKSpriteNode를 만드는 법 (물리 추가 후)?

하지만 정적으로 배치하려는 노드를 잡아서 이동할 수 있습니다. 어떻게 터치 기능에서 이동하고 싶지 않은 노드를 가려 낼 수 있습니까? 아니면 다른 해결책이 있습니까? 그래서

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) 
} 

:

가 여기에 자동 생성 노드에 대한 내 코드 ( override func didMoveToView(view: SKView)에서의 ... 노드의 위치가 고정 만든 static 같은 속성을 찾을려고했는데, 그것을 찾을 수 없습니다 터치의 FUNC 년대 :

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

고맙습니다.

만,이처럼 써야했다 :

letterRecBox.name = "staticNode" 

... 

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