2014-09-18 4 views
0

단일 SKAction을 사용하여 동일한 유형의 복수 SKSpriteNode을 애니메이션화하려고합니다.새 SKSprideNodes를 화면 밖으로 추가하고 애니메이션을 기존 객체와 동기화하는 방법은 무엇입니까?

내가 뭘하고 싶은지, 화면에 동일한 유형의 SKSpriteNode 4 개를 표시하는 것입니다. 그런 다음 버튼을 누를 때 모두 애니메이션을 적용하고 왼쪽으로 이동하십시오. 처음으로 SKSpriteNode이 화면을 벗어나면 오른쪽의 화면 위치에서 다른 SKSpriteNode을 추가하고이 SKAction 루프에 추가하려고합니다.

아래 이미지는 내가 무엇을했는지 자세히 보여줍니다.

enter image description here

은 지금까지 나는 화면에 동일한 유형의 네 SKSpriteNode 년대를 표시하고 배열에 추가 할 수 있었다.

var squareBox = SKSpriteNode() 

    func addSquares(size:CGSize){ 

    for var i = 0; i < 4; i++ { 

     // Create a new sprite node from an image 
     squareBox = SKSpriteNode(imageNamed: "noBox") 

     // Square pysics settings 
     squareBox.physicsBody = SKPhysicsBody(rectangleOfSize: self.squareBox.frame.size) 
     squareBox.physicsBody!.dynamic = false 
     squareBox.physicsBody!.categoryBitMask = squareBoxCategory 
     squareBox.physicsBody!.contactTestBitMask = leftEdgeCategory | edgeCategory 

     // SquareBox positioning on X 
     var xPos = size.width/5 + squareBox.size.height/2 
     var xPosInt = Int(xPos) * (i + 1) 
     xPos = CGFloat(xPosInt) 
     var yPos = size.height/2 + (squareBox.size.height/2) 

     squareBox.position = CGPointMake(xPos - squareBox.size.height/2, yPos) 

     self.addChild(squareBox) 
     squareArray.append(squareBox) 

    } 

} 

나는 그 같은 종류의 네 SKSpriteNode 년대 애니메이션을하는 올바른 방법인지 잘 모르겠지만, 버튼을 누를 때 모두가 원하는대로 왼쪽으로 이동하는 것처럼 보인다.

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

      let move = SKAction.moveByX(-size.width/5 - squareBox.size.height/2, y: 0, duration: 1) 

      print("button clicked!") 

      for box in squareArray { 
       box.runAction(move) 
      } 
     } 
    } 
} 

는 내가 처음 SKSpriteNode 화면을 나갈 때 정의 할 수있는 화면의 왼쪽 가장자리에 보이지 않는 1 픽셀의 라인을 만들었습니다. 이 방법

func addLeftEdge(size:CGSize){ 

    let leftEdge = SKNode() 
    leftEdge.physicsBody = SKPhysicsBody(edgeFromPoint: CGPointMake(1, 1), toPoint: CGPointMake(1, size.height)) 
    leftEdge.physicsBody!.categoryBitMask = leftEdgeCategory 

    self.addChild(leftEdge) 
} 

문제는 그 나는 그들이 1 픽셀의 라인을 터치하면 didBeginContact에 응답하지 않는 그들을 애니메이션 배열의 SKSpriteNode 년대. 결국

func didBeginContact(contact: SKPhysicsContact) { 

    println("contact!") 

} 

나는 왼쪽으로 이동하는 데 몇 초 동안 화면에 Force SKSpriteNode 모든 년대를 적용 할 수 있도록 원하는 시간들이 될 때까지 모든 정류장을 통해 힘의 속도를 내려. 내 생각은 동일한 유형의 4 개의 객체를 만들어 화면에 추가 + 배열 var squareArray = [SKSpriteNode]()에 추가하는 것이 었습니다. 그런 다음 첫 번째 SKSpriteNode이 화면에서 나가면 배열에서 제거하고 마지막에 다시 추가하여 오른쪽 화면에서 벗어나게하여 원활한 애니메이션으로 이동합니다.

나는 전체적인 접근 방식이 잘못되었다고 생각합니다.

위에서 설명한대로 목표를 달성하기 위해 SKSpriteNode을 여러 개 움직이는 것이 가장 좋은 방법이 무엇인지 알려주십시오. 나는 올바른 길을 가고 있는가?

도와주세요. 감사합니다.

leftEdge.physicsBody.Dynamic=YES; //This allows it to enter onContact 
leftEdge.physicsBody.collisionBitMask=0; //Disables edge from being moved by collision 
leftEdge.physicsBody.AffectedByGravity=NO; //Prevents any in game gravity from moving the edge 

이것은 당신이이 할 수 있습니다 : 당신은 둘 다 동적으로 원하기 때문에 접촉을 감지하기 위해

답변

0

의 SKSpriteNodes 중 하나가 physicsBody.Dynamic= YES;

이 있어야합니다, 내가 찾은 빠른 수정이 가장자리는 동적이며 onContact를 트리거 할 수 있지만 가장자리는 여전히 동적이지 않은 것처럼 동작합니다.

+0

각 객체 (선, 사각형, 프레임 가장자리)에 대한 범주 비트 마스크를 생성하고 이에 따라 collisionBitMasks를 설정하여 문제를 해결할 수있었습니다. 힌트를 가져 주셔서 감사합니다! – Omen

+0

문제 없음. 나열된 규칙은 계속 적용됩니다. 코드에 비트 마스크를 포함시키지 않았으므로 올바른 것으로 간주했습니다. 다행히 대답을 찾았습니다. – meisenman

+0

도움 주셔서 감사합니다. 같은 것을하기위한 또 다른 옵션이 있음을 아는 것은 항상 좋은 일입니다. 건배! – Omen

0

이 솔루션은 매우 깨끗하지 않으며이 효과를 얻는 데 필요한 것보다 훨씬 많은 코드가 필요하다고 생각합니다. update() 함수는 4 ~ 5 개의 상자 만 있기 때문에 객체를 순환하여 frameminX 중 하나가 0보다 작은 지 여부와 시작점으로 재설정했는지 확인해야합니다. 그것이 내가 완전히 오프 스크린이기 때문에 내가 가정하고있는 것은 (view.frame.width + box.size.width)입니다. 그렇게하면 배열에 객체를 제거하고 추가 할 필요가 없다는 점에서 배열 조작이 없습니다. 또한 아무 것도 필요하지 않은 곳에 physicsBody를 부착 할 필요가 없습니다. 그리고 당신은 leftEdge가 필요하지 않습니다.