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에서 배열을 제거 할 수 있도록 배열의 항목을 사용 (캐스트?)하는 방법입니다.
올바르게 기억한다면 조인트 배열은 내부 PKPhysicsJoint 인스턴스를 보유하므로 캐스팅이 실패합니다. 왜냐하면 SKPhysicsJoint는 실제 조인트 인스턴스를 만드는 데 편리한 클래스이기 때문입니다. objc에서 이것을 신속하게 해결하는 방법을 모르는 경우 skphysicsjoint 또는 id로 전송할 수 있습니다. 그러나 신속하게 불평하지 않는 방법으로 관절을 캐스팅하는 방법 만 필요합니다. – LearnCocos2D
@ 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- 신속한) 다른 접근 방식을 사용합니다. –