2014-12-25 9 views
5

SKSpriteNode의 하위 클래스를 만들었습니다. 그 클래스의 인스턴스를 SKPhysicsJointLimit 유형의 관절과 함께 연결합니다. 내 GameScene에서이 지금까지 잘 작동SKSpriteNode 하위 클래스 : 모든 접합부를 제거하는 메서드

var joint = SKPhysicsJointLimit.jointWithBodyA(contact.bodyA, bodyB: contact.bodyB, anchorA: pos1!, anchorB: pos2!) 
self.physicsWorld.addJoint(joint) 

: 내 didEndContact 내 (SKPhysicsContact 접촉)이 작업을 수행. 그럼 내가 조인트에서 노드를 놓고 싶습니다. According to the SKPhysicsBody docs there is a property called "joints" which is an array holding SKPhysicsJoint objects. 나는 그것이 필요한 것이라고 정확히 생각했다. 그러나 인스턴스의 관절을 반복하여 물리학 세계에서 제거 할 수는 없다. 일을하려면 내 사용자 지정 SKSpriteNode 하위 클래스에 메서드를 추가했습니다.

func freeJoints(world: SKPhysicsWorld){ 
     if let joints = self.physicsBody?.joints { 
      for joint in joints{ 
       println("found a joint: \(joint)") 
       // example print: 
       //found a joint: <PKPhysicsJointRope: 0x7fbe39e95c50> 
       world.removeJoint(joint as SKPhysicsJoint) 
      } 
     } 
    } 

"Swift dynamic cast cast failed"메시지와 함께 println() 문 뒤에 메서드를 호출하면 오류가 발생합니다. SKPhysicsBody의 공동 재산으로 작업하는 방법에 대한 귀하의 의견에 진심으로 감사드립니다. 더 구체적으로 : 장면의 SKPhysicsWorld에서 배열을 제거 할 수 있도록 배열의 항목을 사용 (캐스트?)하는 방법입니다.

+0

올바르게 기억한다면 조인트 배열은 내부 PKPhysicsJoint 인스턴스를 보유하므로 캐스팅이 실패합니다. 왜냐하면 SKPhysicsJoint는 실제 조인트 인스턴스를 만드는 데 편리한 클래스이기 때문입니다. objc에서 이것을 신속하게 해결하는 방법을 모르는 경우 skphysicsjoint 또는 id로 전송할 수 있습니다. 그러나 신속하게 불평하지 않는 방법으로 관절을 캐스팅하는 방법 만 필요합니다. – LearnCocos2D

+0

@ LearnCocos2D 당신 말이 맞아요. 조인트 배열에는 PKPhysicsJoint 객체가 있습니다. 설명서에 "SKPhysicsJoint 객체 배열이 들어 있습니다"라고되어 있지만 [객관적으로 - 나는 당신이 말한 것처럼 비슷한 문제를 해결하는 튜토리얼을 발견했다. 배열 배열 아이템을 캐스팅하고 물리 세계에서 제거했다. "(http://www.raywenderlich.com/72146/) cut-rope-using-sprite-kit)를 사용하여 만들 수 있습니다. 흥미롭게도 동일한 튜토리얼이 존재합니다. [ "신속하게 처리하는 방법"- 버전] (http://www.raywenderlich.com/82022/create-game-like-cut-the-rope-using-sprite-kit- 신속한) 다른 접근 방식을 사용합니다. –

답변

2

나는 이것을 조사하는데 조금 더 시간을 보냈다.

내가 내 SKSpriteNode 서브 클래스에 속성을 추가하고 나는 또한에 추가 나는 장면의 SKPHysicsWorld에 공동을 추가 관절을

var joints: [SKPhysicsJointLimit] 
override init(){ 
    ... 
    self.joints = [] 
    ... 
} 

매번 나 자신을 관리하기로 결정 : 내가 가지고 올 것을이다 SKNNode 자체의 조인트 배열.

func freeJoints(world: SKPhysicsWorld){ 
     for item in self.joints{ 
      println("removing item from physics world \(item)") 
      world.removeJoint(item) 
     } 
     self.joints.removeAll(keepCapacity: false) 
    } 
} 

이없는 것 같다 다음 SKPHysicsBody의 반복하는 동안 관절을-배열 SKPhysicsJointLimit 항목의 배열이 반복되는 경우 의도 한 작품으로 물리 세계에서 항목을 제거, 내가 SKPhysicsJoint에 캐스팅하고 싶은 점에서 (질문 참조) 실패 같은 일을 약속하는 프레임 워크 관리 배열이 이미 있기 때문에 작업을 수행하는 가장 우아한 방법입니다. 그러나 나는 그것을 활용할 수 없었고 이것은 현재는 효과가있다.