2017-12-21 16 views
1

내 응용 프로그램에서 프로그래밍 방식으로 노드의 물리 본문을 만들고 싶습니다. 그러나 Physics 바디를 프로그래밍 방식으로 만들면 SpriteKit 편집기에서 만든 물리 본문이 작동하지만 작동하지 않는 것 같습니다. Physicsbody가 프로그래밍 방식으로 생성되면 편집기에서 생성 될 때 다른 노드와 충돌하지 않습니다.SKPhysicsBody의 이상한 동작

physicsBody = SKPhysicsBody(rectangleOf: size) 

    if let body = self.physicsBody{ 
     body.isDynamic = true 
     body.affectedByGravity = false 
     body.allowsRotation = false 
     body.categoryBitMask = CollisionCategoryBitmask.shootWall.rawValue 
     body.collisionBitMask = CollisionCategoryBitmask.circle.rawValue 
     body.contactTestBitMask = CollisionCategoryBitmask.circle.rawValue 
    } 

크기가 노드의 크기 속성입니다 :

여기 내 코드입니다.

이제 Physics 본문이 노드에 할당 된 첫 번째 행을 주석으로 처리하고 대신 SpriteKit 장면 편집기에서 물리 본문을 설정하면 작동합니다. 두 조건 모두에서 if 조건 내의 코드가 실행되고 있음에 유의하십시오.

enter image description here

업데이트는 :

흥미로운 것은 내가이 작업을 수행 할 때이다 :

physicsBody = SKPhysicsBody(bodies: [physicsBody!]) 

다음, 그것 때문에 기본적으로 변화하는 것도 어떤 영향을 미칠하지해야하는 것이 뿐만 아니라 작동하지 않습니다. SpriteKit의 버그입니까?

+0

, 나는 느낌 당신이 만약 당신에게 재설정하여 어떤 방법 – Knight0fDragon

+0

에 몸을 재설정하는 한 의미를 사용하여이 작업을 수행 할 수 있습니다 . 장면의 upstate 메서드에 중단 점을 설정하고 물리학 체의 값을 확인했지만, 그것은 0이 아닙니다. – Lenny1357

+0

아니요 당신이 만든 일반 물리학자가 아닌 새로운 일반 물리학자를 적용하고 있습니다 – Knight0fDragon

답변

3

당신은 시체가 세계에 배치되지 않도록, 아직 존재하지 않는이

required init?(coder aDecoder: NSCoder) { 
    factor = 0.5 
    super.init(coder: aDecoder) 
    self.pBody() 

} 

physicsWorld을 수행 할 때.

작성한 후에 수행하고 싶으므로 설정이 완료된 후 클로저로 코드를 실행하여 시작하십시오. 당신은 그런 경우가 안 다음 전무 다시로를 설정하는 DispatchQueue 당신은 당신의 코드를 확장해야

required init?(coder aDecoder: NSCoder) { 
    factor = 0.5 
    super.init(coder: aDecoder) 
    DispatchQueue.main.async { 
     self.pBody() //This will fire after the SKS finished building the scene, so physicsWorld will exist 
    } 
} 
+0

고맙습니다. 하지만 설치가 완료된 후 클로저가 실행되는 이유를 빨리 설명 할 수 있습니까? – Lenny1357

+3

주 스레드에서 새 프로세스로 전환하기 전에 현재 프로세스를 완료해야하기 때문에 DispatchQueue는 현재 프로세스가 완료되면 잡을 새 작업 큐에 Closure를 throw합니다.근본적으로 당신은 접시를 씻고 있습니다, 누군가는 씻어 질 접시 더미에 새로운 접시를 놓습니다. 일단 당신이 씻고있는 현재의 접시를 다 마시면, 깨끗하게 할 필요가있는 다음 사용 가능한 접시를 움켜 잡을 수 있습니다. – Knight0fDragon