다음과 같은 기능을하는 간단한 게임 플레이가 있습니다.
내 목표는 공이 흰색 부분에 닿을 때 (게임 오버 장면이로드 됨) 또는 공이 회색 부분에 닿을 때 (게임이 계속됨) 감지하는 것입니다.
모양이 줄어들고 많은 일이 진행되기 때문에 필자는 필요할 때 SKPhysicsBody를 생성 한 다음 충돌 검사가 발생한 후 제거하는 것이 훨씬 더 효율적이라고 생각했습니다. 따라서 화면을 클릭하면 다음과 같은 일이 발생합니다. (원이 축소되는 데 걸리는 5 * 0.0325 초 후) 회색과 흰색 부분 모두에 물리 몸체를 추가하여 공이 무엇인지 감지 할 수 있습니다. 감동)
DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: {
let trackPhysics = SKPhysicsBody(texture: track.texture!, size: track.texture!.size())
trackPhysics.isDynamic = false
trackPhysics.affectedByGravity = false
track.physicsBody = trackPhysics
let goalPhysics = SKPhysicsBody(texture: goal.texture!, size: goal.texture!.size())
goalPhysics.isDynamic = false
goalPhysics.affectedByGravity = false
goal.physicsBody = goalPhysics
})
작동합니다. SKPhysicsBody는 프레임 속도 손실없이 회색과 흰색 부분에 완벽하게 적용되며 회전을 따릅니다. 문제는 ... 공이 닿는 것을 어떻게 감지합니까? 공식적으로 충돌하지 않았기 때문에 충돌을 전혀 호출하지 않습니다 (실제로 충돌하지 않았기 때문에 의미가 있음).
이것이 기본 논리이며 결과를 확인하고 싶을 때까지 완벽하게 작동합니다.
나는 이것을 시도했다 :
func didBegin(_ contact: SKPhysicsContact) {
print("touching!")
}
func didEnd(_ contact: SKPhysicsContact) {
print("not touching")
}
메시지가 전혀없고 SKPhysicsBody가 적용된 후 1 초 후에 allContactedBodies () 사용을 시도했지만 모두 0으로 카운트를 반환합니다. 나는 이것을 5 초 동안 시도했지만 여전히 작동하지 않습니다.
DispatchQueue.main.asyncAfter(deadline: .now() + seconds + 1, execute: {
print(track.physicsBody!.allContactedBodies().count)
print(goal.physicsBody!.allContactedBodies().count)
})
SKPhysicsBody가 적용된 모습입니다. 물리가 완벽하게 적용된 것을 확인할 수 있습니다.
내가 뭘 잘못하고 있니? 어떤 아이디어?
위의 주석에서 발견 된 솔루션은 다음과 같습니다.
isDynamic
노드 속성을로 설정하십시오 true
.didBegin(contact:)
장면 physicsWorld.contactDelegate
이 설정 되었는지 다시 확인하여 호출되고 있는지 확인합니다 .이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다